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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容