PHP:構(gòu)建 JSON 數(shù)據(jù)接口的 Web 服務(wù)器

Table of Contents

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

在應(yīng)用開(kāi)發(fā)的過(guò)程中,涉及網(wǎng)絡(luò)涩蜘,常常就需要通過(guò)一些 HTTP 請(qǐng)求從網(wǎng)上獲取數(shù)據(jù)颂斜。很多網(wǎng)絡(luò)服務(wù)器(Web server)提供了 URL 類型的 API当悔,通過(guò)訪問(wèn)特定的 URL,就能從服務(wù)器返回?cái)?shù)據(jù),比如:

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

在瀏覽器訪問(wèn)上面這個(gè)鏈接,服務(wù)器就會(huì)返回?cái)?shù)據(jù)。返回的數(shù)據(jù)類型有很多種突照,如:JSON,XML等氧吐。

本文旨在通過(guò)一個(gè)例子簡(jiǎn)要介紹這種服務(wù)器程序的構(gòu)建讹蘑,最終完成一個(gè)服務(wù)器程序,實(shí)現(xiàn)通過(guò) URL 與服務(wù)器通信筑舅,服務(wù)器返回 JSON 格式的數(shù)據(jù)座慰。

<a id="2"></a>問(wèn)題及需求分析

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

觀察上面的 URL,我們可以發(fā)現(xiàn)它可以分為兩個(gè)部分翠拣。

一是主機(jī)地址:http://api.openweathermap.org/data/2.5/weather角骤。

二是參數(shù):q=London,uk&appid=b1b15e88fa797225412429c1c50c122a1

主機(jī)地址和參數(shù)之間用 ? 隔開(kāi)。參數(shù)又可以分為多個(gè)獨(dú)立的參數(shù)邦尊。在這個(gè) URL 中背桐,共包含了兩個(gè)參數(shù),分別是 qappid蝉揍,等號(hào)后面是參數(shù)的值链峭。

我們要做的是一個(gè)物聯(lián)網(wǎng)溫度傳感器的后臺(tái)服務(wù)器,即根據(jù)不同的 URL又沾,返回溫度數(shù)據(jù)或儲(chǔ)存溫度數(shù)據(jù)弊仪。

假設(shè)我們的 API 如下:

獲取最近的一個(gè)溫度數(shù)據(jù) 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” 的數(shù)據(jù)類型是 double

上傳一個(gè)溫度數(shù)據(jù) 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 就是我們即將編寫(xiě)的網(wǎng)頁(yè)文件励饵。key 和 query 是兩個(gè)參數(shù),在 query=set 時(shí)滑燃,還應(yīng)帶有 value 參數(shù)役听。返回的數(shù)據(jù)類型是 JSON,以 status 標(biāo)志操作是否成功表窘,以及附帶有信息或數(shù)據(jù)典予。

<a id="22"></a>JSON 數(shù)據(jù)

JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式。它基于ECMAScript的一個(gè)子集乐严。 JSON采用完全獨(dú)立于語(yǔ)言的文本格式瘤袖,但是也使用了類似于C語(yǔ)言家族的習(xí)慣(包括C、C++昂验、C#捂敌、Java、JavaScript既琴、Perl黍匾、Python等)。這些特性使JSON成為理想的數(shù)據(jù)交換語(yǔ)言呛梆。 易于人閱讀和編寫(xiě),同時(shí)也易于機(jī)器解析和生成(一般用于提升網(wǎng)絡(luò)傳輸速率)磕诊。

JSON 數(shù)據(jù)是可以帶有數(shù)據(jù)類型的填物,如上面返回示例中的 value 是一個(gè) double 類型的數(shù)據(jù)。

<a id="3"></a>實(shí)現(xiàn)

<a id="31"></a>本地服務(wù)器開(kāi)發(fā)環(huán)境:MAMP

MAMP 是經(jīng)典本地服務(wù)器環(huán)境的 Mac OS 軟件霎终。MAMP 這幾個(gè)首字母代表蘋(píng)果的 Mac OS 系統(tǒng)上的 Macintosh滞磺、Apache、MySQL 和 PHP莱褒。在 Windows 系統(tǒng)上也有相應(yīng)的開(kāi)發(fā)環(huán)境击困,WAMP。這里以 MAMP 為例進(jìn)行說(shuō)明。

MAMP 分免費(fèi)版和專業(yè)版阅茶,我們目前只需要用到免費(fèi)版蛛枚。安裝完成后運(yùn)行,點(diǎn)擊 Start Servers 就可以運(yùn)行本地的服務(wù)器脸哀。默認(rèn)的本地服務(wù)器地址是:http://localhost:8888蹦浦。

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

<a id="32"></a>后臺(tái)數(shù)據(jù)庫(kù) MySQL

為了存儲(chǔ)數(shù)據(jù)盲镶,服務(wù)器需要有一個(gè)數(shù)據(jù)庫(kù),并實(shí)現(xiàn)與數(shù)據(jù)庫(kù)之間的通信蝌诡。首先我們用 MAMP 運(yùn)行本地的服務(wù)器溉贿,在打開(kāi)的導(dǎo)航網(wǎng)頁(yè)中打開(kāi)數(shù)據(jù)庫(kù)的管理頁(yè)面。

新建一個(gè)名為 temperatureData 的數(shù)據(jù)庫(kù)浦旱,再新建一個(gè)數(shù)據(jù)表 temperature宇色,并添加如下字段:

這樣就完成了數(shù)據(jù)庫(kù)的配置,目前只需要儲(chǔ)存溫度信心闽寡,因此只配置這幾個(gè)條目代兵。

<a id="33"></a>服務(wù)器程序

有了數(shù)據(jù)庫(kù),接下來(lái)就要寫(xiě)服務(wù)器程序了爷狈。服務(wù)器程序需要完成以下幾個(gè)部分的內(nèi)容:

  1. 連接數(shù)據(jù)庫(kù)植影,與數(shù)據(jù)庫(kù)通信,實(shí)現(xiàn)數(shù)據(jù)的讀取與存儲(chǔ)涎永。
  2. 獲取 URL 中的參數(shù)思币,根據(jù)不同的參數(shù)和參數(shù)值執(zhí)行相應(yīng)的操作。
  3. 封裝要返回的信息羡微,以 JSON 形式返回谷饿。

具體的程序如下,在關(guān)鍵的地方以注釋的方式進(jìn)行說(shuō)明妈倔。

<?php
    //函數(shù):用于把數(shù)據(jù)封裝為 JSON 格式
    function echoJSON($withStatus,$andMessage){
        $data = array('status' => $withStatus, 'message' => $andMessage);
        $jsonstring = json_encode($data);
        header('Content-Type: application/json');
        echo $jsonstring;
    }
    // 配置數(shù)據(jù)庫(kù)
    $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){
    //與數(shù)據(jù)庫(kù)連接成功后博投,獲取 URL 中的參數(shù)值,根據(jù)參數(shù)執(zhí)行相應(yīng)的程序盯蝴。如:$_GET["key"] 用于獲取 URL 中 "key" 的參數(shù)值毅哗。
        $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());
    }
    // 關(guān)閉數(shù)據(jù)庫(kù)連接。
    mysqli_close($link);
?>

在服務(wù)器目錄里新建一個(gè) temperature.php 文件捧挺,將上述程序復(fù)制到文件中保存虑绵。用 MAMP 運(yùn)行服務(wù)器,下面將檢驗(yàn)我們服務(wù)器的配置情況闽烙。

在瀏覽器中訪問(wèn):http://localhost:8888/temperature.php?key=lsw&query=get 就能獲取數(shù)據(jù)庫(kù)中的溫度信息翅睛。如果數(shù)據(jù)庫(kù)中還沒(méi)有溫度信息,則會(huì)返回如下結(jié)果:

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

在瀏覽器中顯示如下:

完整的程序請(qǐng)看這里

關(guān)于如何使用這個(gè) Web 服務(wù)器完成物聯(lián)網(wǎng)溫度傳感器捕发,請(qǐng)參考:LOT|物聯(lián)網(wǎng) 溫度傳感器疏旨。

有任何疑問(wèn)的話,歡迎在下方評(píng)論區(qū)討論爬骤。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末充石,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子霞玄,更是在濱河造成了極大的恐慌骤铃,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坷剧,死亡現(xiàn)場(chǎng)離奇詭異惰爬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)惫企,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門撕瞧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人狞尔,你說(shuō)我怎么就攤上這事丛版。” “怎么了偏序?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵页畦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我研儒,道長(zhǎng)豫缨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任端朵,我火速辦了婚禮好芭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冲呢。我一直安慰自己舍败,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布敬拓。 她就那樣靜靜地躺著邻薯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恩尾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天挽懦,我揣著相機(jī)與錄音翰意,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冀偶,可吹牛的內(nèi)容都是我干的醒第。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼进鸠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼稠曼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起客年,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤霞幅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后量瓜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體司恳,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年绍傲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扔傅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烫饼,死狀恐怖猎塞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杠纵,我是刑警寧澤荠耽,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站淡诗,受9級(jí)特大地震影響骇塘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜韩容,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一款违、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧群凶,春花似錦插爹、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至毅弧,卻和暖如春气嫁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背够坐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工寸宵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留崖面,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓梯影,卻偏偏與公主長(zhǎng)得像巫员,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甲棍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理简识,服務(wù)發(fā)現(xiàn),斷路器感猛,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 點(diǎn)擊查看原文 Web SDK 開(kāi)發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 13,758評(píng)論 0 15
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,957評(píng)論 6 13
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)七扰、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,093評(píng)論 4 62
  • 端午佳節(jié)已過(guò)唱遭,綿綿的端午雨卻根本沒(méi)有停下來(lái)的意思戳寸。肆意的飄落在郁郁蔥蔥的樹(shù)上,靜如明鏡的池塘上拷泽,還有剛剛長(zhǎng)出...
    文案絕學(xué)閱讀 348評(píng)論 0 1