[英]Requests works and URLFetch doesn't
我正試圖在谷歌應用程序引擎應用程序中向python中的粒子服務器發出請求。
在我的終端中,我可以簡單而成功地完成請求,如下所示:
res = requests.get('https://api.particle.io/v1/devices', params={"access_token": {ACCESS_TOKEN}})
但在我的應用程序中,同樣的事情不適用於urlfetch,它一直告訴我它無法找到訪問令牌:
url = 'https://api.particle.io/v1/devices'
payload = {"access_token": {ACCESS_TOKEN}}
form_data = urllib.urlencode(payload)
res = urlfetch.fetch(
url=url,
payload=form_data,
method=urlfetch.GET,
headers={
'Content-Type':
'application/x-www-form-urlencoded'
},
follow_redirects=False
)
我不知道問題是什么,也沒辦法調試。 謝謝!
簡而言之,您的問題是,在您的urlfetch
示例中,您將訪問令牌嵌入到請求正文中,並且由於您發出了一個GET請求 - 它無法攜帶任何請求正文 - 這些信息將被丟棄。
為什么你的第一個片段有效?
因為requests.get()
接受了可選的params
參數,意思是:“把我給你的這個字典轉換成查詢字符串並將其附加到主URL”
所以,在窗簾后面, requests.get()
正在構建一個這樣的字符串:
https://api.particle.io/v1/devices?access_token=ACCESS_TOKEN
這是您應該將GET請求指向的正確端點。
你的第二個片段為什么不起作用?
這次, urlfetch.fetch()
使用與requests.get()
不同的語法(但仍然等效)。 這里需要注意的重要一點是, payload
參數與我們之前在requests.get()
使用的params
參數並不相同。
urlfetch.fetch()
期望我們的查詢字符串-if urlfetch.fetch()
已經被urlencoded到URL中(這就是urllib.urlencode()
在這里發揮作用的原因)。 另一方面, payload
是您應該放置請求主體的地方,以防您發出POST,PUT或PATCH請求,但是particle.io的端點不期望您的OAuth訪問令牌在那里。
這樣的事情應該有效(免責聲明:未經測試):
auth = {"access_token": {ACCESS_TOKEN}}
url_params = urllib.urlencode(auth)
url = 'https://api.particle.io/v1/devices?%s' % url_params
res = urlfetch.fetch(
url=url,
method=urlfetch.GET,
follow_redirects=False
)
請注意我們現在不再需要您之前的Content-type
標頭了,因為我們畢竟沒有攜帶任何內容。 因此,可以從此示例調用中刪除headers
參數。
有關進一步的參考,請查看urlfetch.fetch()
引用和這個SO線程 ,這將有助於您更好地了解HTTP方法,參數和請求體,而不是我在這里的糟糕解釋。
PS:如果particle.io服務器支持它(他們應該),你應該遠離這個身份驗證模式,並在Authorization: Bearer <access_token>
標題中攜帶你的標記。 在URL中攜帶訪問令牌並不是一個好主意,因為它們以這種方式更加明顯並且傾向於保持登錄服務器,因此存在安全風險。 另一方面,在TLS會話中,所有請求標頭始終都是加密的,因此您的身份驗證令牌在那里很好地隱藏。
好吧,事實證明,使用Urlfetch的GET請求不能包含有效負載。 相反,必須使用'?'在url中包含參數 語法如下:
url = 'https://api.particle.io/v1/devices'
url = url + '?access_token=' + {ACCESS_TOKEN}
res = urlfetch.fetch(
url=url,
method=urlfetch.GET,
follow_redirects=False
)
這對我有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.