我正在发出POST请求以尝试获取API访问令牌。我正在使用Python,我从文档中给出的示例使用cURL库,如下所示......
curl \-F 'client_id=CLIENT-ID' \
-F 'client_secret=CLIENT-SECRET' \
-F 'grant_type=authorization_code' \
-F 'redirect_uri=YOUR-REDIRECT-URI' \
-F 'code=CODE' \https://api.instagram.com/oauth/access_token
我正在使用Python请求库,并编写了以下内容......
data =
{'client_id':'xxxxxxxxxxxxxxxxxx',
'client_secret':'xxxxxxxxxxxxxxxxxx',
'grant_type':'authorization_code',
'redirect_uri':'http://localhost:14080/newpage',
'code':code}
token_url = 'https://api.instagram.com/oauth/access_token'
p = requests.post(token_url, params = data)
URL不能让我访问,我想知道的是我写的文档示例与我的不同之处。我是Python(和编程)的新手,所以非常感谢帮助。
答案 0 :(得分:3)
您发送的是params
,而不是data
:
p = requests.post(token_url, params = data)
当您将字典作为params
参数传递时,requests
会尝试将其作为URL上查询字符串的一部分发送。
当您将字典作为data
参数传递时,requests
将对其进行格式编码并将其作为POST数据发送,这相当于curl的-F
所做的。 / p>
您可以通过查看请求网址来验证这一点。如果print(p.url)
显示http://api.instagram.com/oauth/access_token?client_id=xxxxxx&client_secret=xxxxx&…
之类的内容,则表示您的参数最终在网址上而不是在帖子数据中。
见Putting Parameters in URLs和 快速入门文档中的More complicated POST requests了解详细信息。
对于更复杂的调试,您可能需要考虑将curl
和requests
指向记录所有内容的本地服务器,并比较和对比每个客户端发送的内容。使用netcat:
nc -kl 8123
。 (实际参数根据您的平台附带的netcat略有不同 - 或者,如果您的平台没有任何内容,例如Windows,您选择安装哪一个。)curl
命令,但http://localhost:8123/oauth/access_token
为网址。requests
作为网址运行http://localhost:8123/oauth/access_token
脚本。