Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
上篇介紹完發(fā)送get請求的接口,大家必然聯(lián)想到發(fā)送post請求的接口也不會(huì)太難,被聰明的你又猜到了。答案是對(duì)的,雖然發(fā)送post請求的參考例子很簡單,但是實(shí)際遇到的情況卻是很復(fù)雜的,因?yàn)樗邢到y(tǒng)或者軟件、網(wǎng)站都是從登錄開
始的,進(jìn)入這扇門才可以發(fā)現(xiàn)里邊的奧秘,所以首先介紹的第一個(gè)post請求肯定是登錄了,但登錄是最難處理的。如果把登錄問題這只攔路虎解決了,那么后面問題都迎刃而解。
上篇介紹發(fā)送get請求的接口時(shí),學(xué)習(xí)requests模塊,是讓大家去訪問官方網(wǎng)站,查看官方文檔;其實(shí)學(xué)習(xí)一個(gè)新的模塊捷徑,不用去百度什么的,直接用 help 函數(shù)就能查看相關(guān)注釋和案例內(nèi)容。
言
發(fā)送post的請求參考例子很簡單,實(shí)際遇到的情況卻是很復(fù)雜的,首先第一個(gè)post請求肯定是登錄了,但登錄是最難處理的。登錄問題解決了,后面都簡單了。
1.學(xué)習(xí)一個(gè)新的模塊,其實(shí)不用去百度什么的,直接用help函數(shù)就能查看相關(guān)注釋和案例內(nèi)容。
>>import requests
>>help(requests)
2.查看python發(fā)送get和post請求的案例
>>> import requests
>>> r=requests.get('https://www.python.org')
>>> r.status_code
200
>>> 'Python is a programming language' in r.content
True
... or POST:
>>> payload=dict(key1='value1', key2='value2')
>>> r=requests.post('http://httpbin.org/post', data=payload)
>>> print(r.text)
{
...
"form": {
"key2": "value2",
"key1": "value1"
},
...
}
1.用上面給的案例,做個(gè)簡單修改,發(fā)個(gè)post請求
2. payload參數(shù)是字典類型,傳到如下圖的form里
1.post的body是json類型,也可以用json參數(shù)傳入。
2.先導(dǎo)入json模塊,用dumps方法轉(zhuǎn)化成json格式。
3. 返回結(jié)果,傳到data里
1.以禪道登錄為例,模擬登陸,這里需添加請求頭headers,可以用fiddler抓包
2.將請求頭寫成字典格式
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate, br",
"Content-Type": "application/json; charset=utf-8",
"X-Requested-With": "XMLHttpRequest",
"Cookie": "xxx.............", # 此處cookie省略了
"Connection": "keep-alive"
}
# coding:utf-8
# coding:utf-8
import requests
# 禪道host地址
host="http://127.0.0.1"
def login(s,username,psw):
url=host+"/zentao/user-login.html"
h={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate",
"Referer": host+"/zentao/user-login.html",
# "Cookie": # 頭部沒登錄前不用傳cookie,因?yàn)檫@里cookie就是保持登錄的
"Connection": "keep-alive",
"Content-Type": "application/x-www-form-urlencoded",
}
body1={"account": username,
"password": psw,
"keepLogin[]": "on",
"referer": host+"/zentao/my/"
}
# s=requests.session() 不要寫死session
r1=s.post(url, data=body1, headers=h)
# return r1.content # python2的return這個(gè)
return r1.content.decode("utf-8") # python3
def is_login_sucess(res):
if "登錄失敗,請檢查您的用戶名或密碼是否填寫正確。" in res:
return False
elif "parent.location=" in res:
return True
else:
return False
if __name__=="__main__":
s=requests.session()
a=login(s, "admin", "e10adc3949ba59abbe56e057f20f883e")
result=is_login_sucess(a)
print("測試結(jié)果:%s"%result)
micropython 教程的目的是解釋如何使用 micropython 和 urequests 庫執(zhí)行 http post 請求。這在esp32和esp8266上都進(jìn)行了測試。
本MicroPython教程旨在闡釋如何借助MicroPython和urequests庫(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py)執(zhí)行HTTP POST請求。本教程在esp32和ESP8266上均進(jìn)行了測試。下文打印結(jié)果均出自ESP8266上的測試。
我們將把HTTP POST請求發(fā)送至一個(gè)假的在線測試REST API。該網(wǎng)站主頁:http://jsonplaceholder.typicode.com/。其支持多條路徑,而本教程將使用其中的/posts路徑。但請注意,該路徑名稱與我們將要使用的POST方法互不相干。在此示例中,一條post對(duì)應(yīng)一個(gè)表示用戶寫的(如在網(wǎng)站中)post的虛擬對(duì)象。另一方面,POST是我們將要使用的HTTP方法。
當(dāng)然,為適用本教程,設(shè)備需事先連網(wǎng),這樣它才能夠發(fā)送HTTP請求。請參閱這篇之前的帖子:ESP32 MicroPython教程:連接Wi-Fi網(wǎng)絡(luò),了解如何將運(yùn)行MicroPython的設(shè)備連接到WiFi網(wǎng)絡(luò)。如果你想讓設(shè)備在啟動(dòng)后自動(dòng)建立連接,請查看另一篇帖子:ESP32 / ESP8266 MicroPython教程:自動(dòng)連接WiFi。在此示例中,我將MicroPython設(shè)置為設(shè)備啟動(dòng)后自動(dòng)連接WiFi網(wǎng)絡(luò)。
重要提示:本文撰寫之際,所用的MicroPython版本默認(rèn)包含urequests模塊。因此,直接導(dǎo)入該模塊即可,無需執(zhí)行其他操作。但請注意,此情況或有變化,MicroPython新出版本的默認(rèn)配置可能不再包含該模塊,你需要另行配置。
我們首先要做的是導(dǎo)入urequests模塊,以獲取執(zhí)行HTTP POST請求所需的函數(shù)。
1 import urequests
然后通過調(diào)用urequests模塊的post函數(shù)(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L103)發(fā)送請求。此函數(shù)以我們要發(fā)送HTTP post請求的URL作為輸入值。其還可接收鍵-參數(shù)列形式的其他參數(shù),因?yàn)閺脑摵瘮?shù)的定義即可看出,其在原型中定義了**kw參數(shù)。你可以通過這篇寫得非常好的文章(https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/)了解更多關(guān)于**kwargs的信息。
由于post函數(shù)是在其函數(shù)體部分調(diào)用request函數(shù)(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L33),因此我們可以確認(rèn)數(shù)據(jù)參數(shù)是我們能夠傳遞的額外參數(shù)之一。這對(duì)應(yīng)HTTP POST請求的函數(shù)體。
由于這只是一個(gè)展示如何使用該函數(shù)的簡單示例,因此我們將只發(fā)送一個(gè)數(shù)據(jù)字符串作為函數(shù)體且不指定任何特定內(nèi)容類型。當(dāng)然,在實(shí)際情況下,我們還是希望能夠指定內(nèi)容類型并遵守其應(yīng)用于請求體的格式。
請注意,該URL對(duì)應(yīng)簡介中提到的虛擬在線REST API網(wǎng)站的/posts路徑。
1 response=urequests.post("http://jsonplaceholder.typicode.com/posts", data="some dummy content")
請注意,此函數(shù)調(diào)用將返回一個(gè)Response類(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L3)的對(duì)象,我們將其存儲(chǔ)在變量中,以便稍后處理HTTP請求的結(jié)果。
圖1展示了使用Postman函數(shù)(https://www.getpostman.com/apps)執(zhí)行同一POST請求得到的結(jié)果。如圖所示,我們將收到一個(gè)指示新來源已成功創(chuàng)建(ID為101的post對(duì)象)的響應(yīng),該響應(yīng)與我們的請求內(nèi)容無關(guān)。
即使我們繼續(xù)發(fā)送請求,響應(yīng)仍將保持不變,因?yàn)槲覀兠鎸?duì)的是假的測試API。這就是指定內(nèi)容類型或請求體非常有意義但我們無需費(fèi)心進(jìn)行此操作的原因。
欲了解如何使用Postman發(fā)送HTTP POST請求。
圖1 – 使用Postman發(fā)送HTTP POST請求的輸出結(jié)果。
最后,在MicroPython中獲取請求的響應(yīng)內(nèi)容,為此只需訪問Response對(duì)象的text屬性即可。由于響應(yīng)類型為JSON,因此我們還可以視其為內(nèi)容已解析的字典對(duì)象,通過Response對(duì)象(其在實(shí)現(xiàn)中使用ujson庫)的json函數(shù)檢索該響應(yīng)。
1 print(response.text) 2 print(response.json())
本教程所有命令的結(jié)果如圖2所示。可以從中看出,我們獲取的原始響應(yīng)既可以是字符串格式,也可以是已解析的JSON對(duì)象。
圖2 – 使用MicroPython發(fā)送HTTP POST請求的結(jié)果。
注:本文作者是Nuno Santos,他是一位和藹可親的電子和計(jì)算機(jī)工程師,住在葡萄牙里斯本 (Lisbon)。
查看更多ESP32/ESP8266教程和項(xiàng)目,請點(diǎn)擊 :
ESP32教程大全:http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=271930
ESP32 tutorial:https://www.dfrobot.com/blog-964.html
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。