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ù),分別是 q
和 appid
蝉揍,等號(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)容:
- 連接數(shù)據(jù)庫(kù)植影,與數(shù)據(jù)庫(kù)通信,實(shí)現(xiàn)數(shù)據(jù)的讀取與存儲(chǔ)涎永。
- 獲取 URL 中的參數(shù)思币,根據(jù)不同的參數(shù)和參數(shù)值執(zhí)行相應(yīng)的操作。
- 封裝要返回的信息羡微,以 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