PHP:構建 JSON 數據接口的 Web 服務器

Table of Contents

<a id="1"></a>前言

在應用開發的過程中,涉及網絡,常常就需要通過一些 HTTP 請求從網上獲取數據。很多網絡服務器(Web server)提供了 URL 類型的 API,通過訪問特定的 URL,就能從服務器返回數據,比如:

http://api.openweathermap.org/data/2.5/weather?q=London,uk&appid=b1b15e88fa797225412429c1c50c122a1

在瀏覽器訪問上面這個鏈接,服務器就會返回數據。返回的數據類型有很多種,如:JSON,XML等。

本文旨在通過一個例子簡要介紹這種服務器程序的構建,最終完成一個服務器程序,實現通過 URL 與服務器通信,服務器返回 JSON 格式的數據。

<a id="2"></a>問題及需求分析

<a id="21"></a>API

觀察上面的 URL,我們可以發現它可以分為兩個部分。

一是主機地址:http://api.openweathermap.org/data/2.5/weather。

二是參數:q=London,uk&appid=b1b15e88fa797225412429c1c50c122a1

主機地址和參數之間用 ? 隔開。參數又可以分為多個獨立的參數。在這個 URL 中,共包含了兩個參數,分別是 qappid,等號后面是參數的值。

我們要做的是一個物聯網溫度傳感器的后臺服務器,即根據不同的 URL,返回溫度數據或儲存溫度數據。

假設我們的 API 如下:

獲取最近的一個溫度數據 API:
http://localhost:8888/temperature.php?key=lsw&query=get
返回示例(JSON):
成功:{"status":true,"date":"2016-11-17 19:13:09","value":32.63}
失?。簕"status”:false,”message”:”*"}
備注:”value” 的數據類型是 double

上傳一個溫度數據 API:
http://localhost:8888/temperature.php?key=lsw&query=set&value=27.1
返回示例(JSON):
成功:{"status":true,"message":"setting success"}
失?。簕"status”:false,”message”:”*"}

URL 中的 temperature.php 就是我們即將編寫的網頁文件。key 和 query 是兩個參數,在 query=set 時,還應帶有 value 參數。返回的數據類型是 JSON,以 status 標志操作是否成功,以及附帶有信息或數據。

<a id="22"></a>JSON 數據

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基于ECMAScript的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數據交換語言。 易于人閱讀和編寫,同時也易于機器解析和生成(一般用于提升網絡傳輸速率)。

JSON 數據是可以帶有數據類型的,如上面返回示例中的 value 是一個 double 類型的數據。

<a id="3"></a>實現

<a id="31"></a>本地服務器開發環境:MAMP

MAMP 是經典本地服務器環境的 Mac OS 軟件。MAMP 這幾個首字母代表蘋果的 Mac OS 系統上的 Macintosh、Apache、MySQL 和 PHP。在 Windows 系統上也有相應的開發環境,WAMP。這里以 MAMP 為例進行說明。

MAMP 分免費版和專業版,我們目前只需要用到免費版。安裝完成后運行,點擊 Start Servers 就可以運行本地的服務器。默認的本地服務器地址是:http://localhost:8888。

在 MAMP 的 Preferences.. -> Web Server -> Document Foot 可以定位到服務器源文件目錄。服務器的程序就保存在這個目錄里。

<a id="32"></a>后臺數據庫 MySQL

為了存儲數據,服務器需要有一個數據庫,并實現與數據庫之間的通信。首先我們用 MAMP 運行本地的服務器,在打開的導航網頁中打開數據庫的管理頁面。

新建一個名為 temperatureData 的數據庫,再新建一個數據表 temperature,并添加如下字段:

這樣就完成了數據庫的配置,目前只需要儲存溫度信心,因此只配置這幾個條目。

<a id="33"></a>服務器程序

有了數據庫,接下來就要寫服務器程序了。服務器程序需要完成以下幾個部分的內容:

  1. 連接數據庫,與數據庫通信,實現數據的讀取與存儲。
  2. 獲取 URL 中的參數,根據不同的參數和參數值執行相應的操作。
  3. 封裝要返回的信息,以 JSON 形式返回。

具體的程序如下,在關鍵的地方以注釋的方式進行說明。

<?php
    //函數:用于把數據封裝為 JSON 格式
    function echoJSON($withStatus,$andMessage){
        $data = array('status' => $withStatus, 'message' => $andMessage);
        $jsonstring = json_encode($data);
        header('Content-Type: application/json');
        echo $jsonstring;
    }
    // 配置數據庫
    $user = 'root';
    $password = 'root';
    $db = 'temperatureData';
    $host = 'localhost';
    $port = 8889;
    $link = mysqli_init();
    $success = mysqli_real_connect(
                                   $link,
                                   $host,
                                   $user,
                                   $password,
                                   $db,
                                   $port
                                   );
    $privateKey = "lsw";
    if($success){
    //與數據庫連接成功后,獲取 URL 中的參數值,根據參數執行相應的程序。如:$_GET["key"] 用于獲取 URL 中 "key" 的參數值。
        $key = $_GET["key"];
        if($key == $privateKey){
            $query = $_GET["query"];
            switch ($query){
                case "get":
                    $result = mysqli_query($link,"SELECT * FROM `Temperature`");
                    $row = mysqli_fetch_array($result);
                    
                    $data = array('status' => true, 'date' => $row["Date"], 'value' => (double)$row["Value"]);
                    $jsonstring = json_encode($data);
                    header('Content-Type: application/json');
                    echo $jsonstring;
                    break;
                case "set":
                    $value = $_GET["value"];
                    $valueDouble = (double)$value;
                    if($valueDouble){
                        mysqli_query($link,"DELETE FROM `Temperature` WHERE 1");
                        mysqli_query($link,"INSERT INTO `Temperature`(`Date`, `Value`) VALUES (CURRENT_TIMESTAMP,$valueDouble);");
                        $data = array('status' => true, 'message' => 'setting success');
                        $jsonstring = json_encode($data);
                        header('Content-Type: application/json');
                        echo $jsonstring;
                    }else{
                        echoJSON(false,"invalid value");
                    }
                    break;
                default:
                    echoJSON(false,"unsupported query");
            }
        }else{
            echoJSON(false,"invalid key");
        }
    }else{
        echoJSON(false,"Connect Error: " . mysqli_connect_error());
    }
    // 關閉數據庫連接。
    mysqli_close($link);
?>

在服務器目錄里新建一個 temperature.php 文件,將上述程序復制到文件中保存。用 MAMP 運行服務器,下面將檢驗我們服務器的配置情況。

在瀏覽器中訪問:http://localhost:8888/temperature.php?key=lsw&query=get 就能獲取數據庫中的溫度信息。如果數據庫中還沒有溫度信息,則會返回如下結果:

{"status":true,"date":null,"value":0}

在瀏覽器中顯示如下:

完整的程序請看這里

關于如何使用這個 Web 服務器完成物聯網溫度傳感器,請參考:LOT|物聯網 溫度傳感器

有任何疑問的話,歡迎在下方評論區討論。

附上我的Github:LinShiwei (Lin Shiwei) · GitHub

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 點擊查看原文 Web SDK 開發手冊 SDK 概述 網易云信 SDK 為 Web 應用提供一個完善的 IM 系統...
    layjoy閱讀 13,833評論 0 15
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,049評論 6 13
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,151評論 4 61
  • 端午佳節已過,綿綿的端午雨卻根本沒有停下來的意思。肆意的飄落在郁郁蔥蔥的樹上,靜如明鏡的池塘上,還有剛剛長出...
    文案絕學閱讀 355評論 0 1