Python 请求有效且URLFetch不';T

Python 请求有效且URLFetch不';T,python,google-app-engine,python-requests,urlfetch,Python,Google App Engine,Python Requests,Urlfetch,我试图在google应用程序引擎应用程序中向python中的粒子服务器发出请求 在我的终端中,我可以通过以下请求简单而成功地完成请求: res = requests.get('https://api.particle.io/v1/devices', params={"access_token": {ACCESS_TOKEN}}) 但在我的应用程序中,urlfetch不起同样的作用,它一直告诉我它找不到访问令牌: url = 'https://api.particle.io/v1/dev

我试图在google应用程序引擎应用程序中向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
参数,这意味着:“使用我给你的这个字典,将它的所有键/值对转换为a,并将其附加到主URL”

因此,在幕后,
requests.get()
正在构建如下字符串:

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

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

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

这一次,
urlfetch.fetch()
使用了与
requests.get()不同的语法(但仍然等效)。这里需要注意的重要一点是,
有效负载
参数与您以前在
请求.get()中使用的
参数
的含义不同

urlfetch.fetch()
希望我们的查询字符串(如果有的话)已经被URL编码到URL中(这就是为什么
urllib.urlencode()
在这里起作用)。另一方面,
payload
是您在发出POST、put或PATCH请求时应该放置请求正文的位置,但particle.io的端点不希望您的OAuth访问令牌在那里

类似的东西应该可以工作(免责声明:未测试):

auth={“访问令牌”:{访问令牌}
url_params=urllib.urlencode(auth)
url='1〕https://api.particle.io/v1/devices?%s“%url\u参数”
res=urlfetch.fetch(
url=url,
方法=urlfetch.GET,
follow_redirects=False
)
请注意,现在我们不再需要您以前的
内容类型
标题,因为我们根本不携带任何内容。因此,可以从这个示例调用中删除
headers
参数

为了进一步参考,请看一下
urlfetch.fetch()
,这将有助于您更好地了解HTTP方法、参数和请求体,而不是我在这里拙劣的解释


PS:如果particle.io服务器支持(它们应该支持),您应该远离此身份验证模式,而是将您的令牌放在
授权:承载
头中。在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 
)

这对我很有用。

是的,就是这样;比我下面的答案更详细。谢谢我懂了;我保护它,使它在服务器中不是纯文本,但我没有考虑url发送本身。再次感谢。