閑言碎語(yǔ)
好久沒(méi)發(fā)文章了,因?yàn)楹孟衲苣脕?lái)水文章的模塊都用完了。后來(lái)有簡(jiǎn)友提到http模塊,翻了先前的文章發(fā)現(xiàn)居然把http模塊忘記了,囧。
另外,需要說(shuō)的是,這個(gè)模塊還涉及到HTTP的一些知識(shí)點(diǎn),但是本人也不是特別了解。有些地方可能說(shuō)的不是特別準(zhǔn)確。本文還是針對(duì)模塊自身如何使用來(lái)說(shuō)。
同時(shí)文檔中提到了,由于內(nèi)存限制,如果訪問(wèn)一些大文件頁(yè)面,將會(huì)failed。另外,也不能同時(shí)發(fā)起請(qǐng)求。所以,我個(gè)人覺(jué)得,這個(gè)模塊比較合適用在訪問(wèn)服務(wù)端的數(shù)據(jù)API。
模塊函數(shù)
模塊的函數(shù)很少,就只有5個(gè)。一起來(lái)看一下~
|序號(hào)|函數(shù)名|參數(shù)|返回值|
|:--|:--:|:---:|:--:|--:|
|1|http.delete()|url, headers, body, callback|nil|
|2|http.get()|url, headers, callback|nil|
|3|http.post()|url, headers, body, callback|nil|
|4|http.put()|url, headers, body, callback|nil|
|5|http.request()|url, method, headers, body, callback|nil|
這幾個(gè)函數(shù)的參數(shù)都差不多,同時(shí)返回值都為nil。因?yàn)檎?qǐng)求的結(jié)果是通過(guò)回調(diào)的形式來(lái)進(jìn)行的。回調(diào)函數(shù)接收三個(gè)參數(shù),分別是status_code、body、headers(似乎沒(méi)有這個(gè)參數(shù))。前4個(gè)函數(shù)對(duì)應(yīng)了一種http(s)請(qǐng)求。最后一個(gè)則可以變換成任何一種http(s)請(qǐng)求。
url表示請(qǐng)求地址的字符串,需要以http或者h(yuǎn)ttps開(kāi)頭,比如http://www.itdecent.cn 。
headers表示請(qǐng)求頭,可以是自定義的頭,也可以是重寫標(biāo)準(zhǔn)的頭。當(dāng)參數(shù)為nil的時(shí)候,傳入默認(rèn)的頭,不同請(qǐng)求,默認(rèn)值不同。get請(qǐng)求的默認(rèn)頭,格式如下:
host: '192.168.199.202:3000',
connection: 'close',
'user-agent': 'ESP8266'
}```
connection 這個(gè)只能是close!重寫的時(shí)候別寫成其他的。
body,要發(fā)送出去的數(shù)據(jù)放在這個(gè)參數(shù)中。
關(guān)于前4個(gè)請(qǐng)求是什么意思,我一陣胡亂百度后,大概可以這樣用。GET請(qǐng)求用來(lái)請(qǐng)求服務(wù)器上的數(shù)據(jù)。POST請(qǐng)求則是用來(lái)請(qǐng)求修改服務(wù)器上的某個(gè)數(shù)據(jù)。PUT請(qǐng)求用來(lái)增加數(shù)據(jù)。DELETE請(qǐng)求則是刪除某個(gè)數(shù)據(jù)。但是,通常使用前兩個(gè)來(lái)進(jìn)行增刪改查。
## 實(shí)踐一下
這里直接拷貝文檔中的幾個(gè)例子,來(lái)看看這5個(gè)函數(shù)有什么效果。首先是GET,
http.get("http://httpbin.org/ip", nil, function(code, data)
if (code < 0) then
print("HTTP request failed")
else
print(code, data)
end
end)
這個(gè)例子里,回調(diào)函數(shù)的data傳入了一個(gè)帶ip地址的json。也就是通過(guò)GET請(qǐng)求,服務(wù)器返回一個(gè)ip數(shù)據(jù)。
接著看看POST請(qǐng)求。這里例子里,重寫了請(qǐng)求頭。注意,請(qǐng)求頭需要用\r\n來(lái)做換行。至于,請(qǐng)求頭都有些什么參數(shù),還請(qǐng)自行百度~
http.post('http://httpbin.org/post',
'Content-Type: application/json\r\n',
'{"hello":"world"}',
function(code, data)
if (code < 0) then
print("HTTP request failed")
else
print(code, data)
end
end)
再來(lái)看看DELETE和PUT,直接貼代碼好了
http.delete('http://httpbin.org/delete',
"",
"",
function(code, data)
if (code < 0) then
print("HTTP request failed")
else
print(code, data)
end
end)
http.put('http://httpbin.org/put',
'Content-Type: text/plain\r\n',
'Hello!\nStay a while, and listen...\n',
function(code, data)
if (code < 0) then
print("HTTP request failed")
else
print(code, data)
end
end)
用法都是大同小異的。最后來(lái)看一下,request這個(gè)函數(shù)。可以用來(lái)執(zhí)行一個(gè)自定義的http請(qǐng)求或者是任何一個(gè)http中已有的請(qǐng)求,比如HEAD,OPTIONS。這里來(lái)看一下如何使用request來(lái)發(fā)起一個(gè)GET請(qǐng)求。
http.request("http://httpbin.org/ip", "GET", "", "",
function(code, data)
if (code < 0) then
print("HTTP request failed")
else
print(code, data)
end
end)
很簡(jiǎn)單,第二個(gè)參數(shù)傳入GET方法的字符串即可。這時(shí)候request就相當(dāng)于**.get**這個(gè)函數(shù)了。
## 多說(shuō)兩句
上面的例子離實(shí)際應(yīng)用還是比較遠(yuǎn),后面如果有應(yīng)用再做補(bǔ)充。個(gè)人覺(jué)得,應(yīng)用的重點(diǎn)還是在于GET和PUST,用來(lái)想服務(wù)器請(qǐng)求某個(gè)數(shù)據(jù)或者向服務(wù)器推送某個(gè)數(shù)據(jù),比如ADC讀到的溫度值之類的。
如果有簡(jiǎn)友對(duì)這個(gè)模塊了解的話,請(qǐng)別忘記留言分享。
> 簡(jiǎn)書評(píng)論不能貼圖, 如有需要可以到我的GitHub上提[issues](https://github.com/hanfengcan/nodemcu-just4fun/issues)