簡體   English   中英

請求有效,而URLFetch則沒有

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM