请求有效并且URLFetch不能

我试图在谷歌应用程序引擎应用程序中向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示例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()期望我们的查询字符串 - 如果任何 - 已经被urlencoded入URL中(这就是为什么urllib.urlencode()在这里发挥作用)。 另一方面,如果您发布POST,PUT或PATCH请求,则payload是您应该放置请求主体的位置,但是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 
)

这对我有效。

链接地址: http://www.djcxy.com/p/41329.html

上一篇: Requests works and URLFetch doesn't

下一篇: how can i hide ID in URL with asp.net MVC4