繁体   English   中英

使用Python的请求库而不是cURL

[英]Using Python's requests library instead of cURL

我正在发出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(和编程)的新手,所以非常感谢帮助。

你发送的是params ,而不是data

p = requests.post(token_url, params = data)

将字典作为params参数传递时, requests尝试将其作为URL上查询字符串的一部分发送。

当您将字典作为data参数传递时, requests将对其进行格式编码并将其作为POST数据发送,这相当于curl的-F所做的。

您可以通过查看请求URL来验证这一点。 如果print(p.url)显示类似http://api.instagram.com/oauth/access_token?client_id=xxxxxx&client_secret=xxxxx&… print(p.url) ,则表示您的参数最终在URL上而不是在帖子数据中。

有关完整详细信息,请参阅快速入门文档中的在URL中放置参数更复杂的POST请求


对于更复杂的调试,您可能需要考虑将curlrequests指向记录所有内容的本地服务器,并比较和对比每个客户端发送的内容。 一个非常简单快速和脏的方法是使用netcat

  • 在终端/ DOS窗口中,运行nc -kl 8123 (实际参数根据您的平台附带的netcat略有不同 - 或者,如果您的平台没有附带任何内容,例如Windows,您选择安装哪一个。)
  • 运行curl命令,但使用http://localhost:8123/oauth/access_token作为URL。
  • 运行您的requests脚本,再次使用http://localhost:8123/oauth/access_token作为URL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM