上篇介紹完發送get請求的接口,大家必然聯想到發送post請求的接口也不會太難,被聰明的你又猜到了。答案是對的,雖然發送post請求的參考例子很簡單,但是實際遇到的情況卻是很復雜的,因為所有系統或者軟件、網站都是從登錄開
始的,進入這扇門才可以發現里邊的奧秘,所以首先介紹的第一個post請求肯定是登錄了,但登錄是最難處理的。如果把登錄問題這只攔路虎解決了,那么后面問題都迎刃而解。
上篇介紹發送get請求的接口時,學習requests模塊,是讓大家去訪問官方網站,查看官方文檔;其實學習一個新的模塊捷徑,不用去百度什么的,直接用 help 函數就能查看相關注釋和案例內容。
言
發送post的請求參考例子很簡單,實際遇到的情況卻是很復雜的,首先第一個post請求肯定是登錄了,但登錄是最難處理的。登錄問題解決了,后面都簡單了。
1.學習一個新的模塊,其實不用去百度什么的,直接用help函數就能查看相關注釋和案例內容。
>>import requests
>>help(requests)
2.查看python發送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.用上面給的案例,做個簡單修改,發個post請求
2. payload參數是字典類型,傳到如下圖的form里
1.post的body是json類型,也可以用json參數傳入。
2.先導入json模塊,用dumps方法轉化成json格式。
3. 返回結果,傳到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,因為這里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這個
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("測試結果:%s"%result)
micropython 教程的目的是解釋如何使用 micropython 和 urequests 庫執行 http post 請求。這在esp32和esp8266上都進行了測試。
本MicroPython教程旨在闡釋如何借助MicroPython和urequests庫(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py)執行HTTP POST請求。本教程在esp32和ESP8266上均進行了測試。下文打印結果均出自ESP8266上的測試。
我們將把HTTP POST請求發送至一個假的在線測試REST API。該網站主頁:http://jsonplaceholder.typicode.com/。其支持多條路徑,而本教程將使用其中的/posts路徑。但請注意,該路徑名稱與我們將要使用的POST方法互不相干。在此示例中,一條post對應一個表示用戶寫的(如在網站中)post的虛擬對象。另一方面,POST是我們將要使用的HTTP方法。
當然,為適用本教程,設備需事先連網,這樣它才能夠發送HTTP請求。請參閱這篇之前的帖子:ESP32 MicroPython教程:連接Wi-Fi網絡,了解如何將運行MicroPython的設備連接到WiFi網絡。如果你想讓設備在啟動后自動建立連接,請查看另一篇帖子:ESP32 / ESP8266 MicroPython教程:自動連接WiFi。在此示例中,我將MicroPython設置為設備啟動后自動連接WiFi網絡。
重要提示:本文撰寫之際,所用的MicroPython版本默認包含urequests模塊。因此,直接導入該模塊即可,無需執行其他操作。但請注意,此情況或有變化,MicroPython新出版本的默認配置可能不再包含該模塊,你需要另行配置。
我們首先要做的是導入urequests模塊,以獲取執行HTTP POST請求所需的函數。
1 import urequests
然后通過調用urequests模塊的post函數(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L103)發送請求。此函數以我們要發送HTTP post請求的URL作為輸入值。其還可接收鍵-參數列形式的其他參數,因為從該函數的定義即可看出,其在原型中定義了**kw參數。你可以通過這篇寫得非常好的文章(https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/)了解更多關于**kwargs的信息。
由于post函數是在其函數體部分調用request函數(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L33),因此我們可以確認數據參數是我們能夠傳遞的額外參數之一。這對應HTTP POST請求的函數體。
由于這只是一個展示如何使用該函數的簡單示例,因此我們將只發送一個數據字符串作為函數體且不指定任何特定內容類型。當然,在實際情況下,我們還是希望能夠指定內容類型并遵守其應用于請求體的格式。
請注意,該URL對應簡介中提到的虛擬在線REST API網站的/posts路徑。
1 response=urequests.post("http://jsonplaceholder.typicode.com/posts", data="some dummy content")
請注意,此函數調用將返回一個Response類(https://github.com/micropython/micropython-lib/blob/master/urequests/urequests.py#L3)的對象,我們將其存儲在變量中,以便稍后處理HTTP請求的結果。
圖1展示了使用Postman函數(https://www.getpostman.com/apps)執行同一POST請求得到的結果。如圖所示,我們將收到一個指示新來源已成功創建(ID為101的post對象)的響應,該響應與我們的請求內容無關。
即使我們繼續發送請求,響應仍將保持不變,因為我們面對的是假的測試API。這就是指定內容類型或請求體非常有意義但我們無需費心進行此操作的原因。
欲了解如何使用Postman發送HTTP POST請求。
圖1 – 使用Postman發送HTTP POST請求的輸出結果。
最后,在MicroPython中獲取請求的響應內容,為此只需訪問Response對象的text屬性即可。由于響應類型為JSON,因此我們還可以視其為內容已解析的字典對象,通過Response對象(其在實現中使用ujson庫)的json函數檢索該響應。
1 print(response.text) 2 print(response.json())
本教程所有命令的結果如圖2所示。可以從中看出,我們獲取的原始響應既可以是字符串格式,也可以是已解析的JSON對象。
圖2 – 使用MicroPython發送HTTP POST請求的結果。
注:本文作者是Nuno Santos,他是一位和藹可親的電子和計算機工程師,住在葡萄牙里斯本 (Lisbon)。
查看更多ESP32/ESP8266教程和項目,請點擊 :
ESP32教程大全:http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=271930
ESP32 tutorial:https://www.dfrobot.com/blog-964.html
*請認真填寫需求信息,我們會在24小時內與您取得聯系。