gpt4 book ai didi

python - 请求有效而 URLFetch 无效

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:55 27 4
gpt4 key购买 nike

我正在尝试在谷歌应用引擎应用程序中向 python 中的粒子服务器发出请求。

在我的终端中,我可以简单而成功地完成请求,请求如下:

res = requests.get('https://api.particle.io/v1/devices', params={"access_token": {ACCESS_TOKEN}})

但在我的应用程序中,同样的事情不适用于 urlfetch,它一直告诉我找不到访问 token :

    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 中例如,您正在将访问 token 嵌入到请求正文中,并且由于您发出的是 GET 请求 - 该请求不能携带任何请求正文 - 此信息将被丢弃。

为什么您的第一个代码段有效?

因为 requests.get()采用可选的 params参数意思是:“拿我给你的这本字典,将它的所有键/值对转换成一个 query string 并将它附加到主 URL”

所以,在幕后,requests.get()正在构建这样的字符串:

https://api.particle.io/v1/devices?access_token=ACCESS_TOKEN

这是您应该将 GET 请求指向的正确端点。

为什么您的第二个代码段不起作用?

这一次,urlfetch.fetch()使用与 requests.get() 不同的语法(但仍然等同)。这里要注意的重要一点是 payload参数与我们的params 意思相同您之前在 requests.get() 中使用的参数.

urlfetch.fetch()期望我们的查询字符串 - 如果有的话 - 已经被 urlencoded 到 URL 中(这就是 urllib.urlencode() 在这里发挥作用的原因)。另一方面,payload是您应该放置请求主体的地方,以防您发出 POST、PUT 或 PATCH 请求,但 particle.io 的端点并不期望您的 OAuth 访问 token 在那里。

像这样的东西应该可以工作(免责声明:未测试):

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 header 了,因为我们毕竟没有携带任何内容。因此,headers可以从此示例调用中删除参数。

如需进一步引用,请查看 urlfetch.fetch() referencethis SO thread与我在这里的拙劣解释相比,这有望让您更好地了解 HTTP 方法、参数和请求主体。

PS:如果 particle.io 服务器支持它(它们应该支持),您应该远离此身份验证模式并在 Authorization: Bearer <access_token> 中携带您的 token 。 header 代替。在 URL 中携带访问 token 不是一个好主意,因为这样它们更容易看到并且往往会在服务器中保持登录状态,因此会带来安全风险。另一方面,在 TLS session 中,所有请求 header 始终被加密,因此您的身份验证 token 被很好地隐藏在那里。

关于python - 请求有效而 URLFetch 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31441350/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com