我正在学习处理请求和JSON,所以我决定使用我大量使用的应用程序的API。我已经成功发出了接收身份验证代码和访问令牌的请求,因此我可以通过以下方式获取请求内容:
requests.post('https://getpocket.com/v3/get',
data = {'consumer_key' : consumer_key,
'access_token' : access_token,
'detailType' : 'simple',
'count' : '50'})
但是当我想修改条目时,我建立了类似的请求,由于某种原因它没有工作:
requests.post('https://getpocket.com/v3/send',
data = {'consumer_key' : consumer_key,
'access_token' : access_token,
'actions' : [{'item_id':'1000000000','action':'archive'}]})
API guide建议使用以下有效示例(我将其解码为可见性):
https://getpocket.com/v3/send?actions=[{"action":"archive","time":1348853312,"item_id":229279689}]&access_token=ACCESS_TOKEN&consumer_key=CONSUMER_KEY
我收到错误" 400 Bad Request"其中一个标题说:"无效请求,请参阅API文档"。
我的语法有什么问题吗?
答案 0 :(得分:1)
我发现你正在使用requests
库。从2.4.2版开始,您可以使用json
作为参数。它应该有比data
更好的json编码。
requests.post('https://getpocket.com/v3/send', json={
'consumer_key': consumer_key,
'access_token': access_token,
'actions': [{
'item_id':'1000000000',
'action':'archive'
}]
})
有关详细信息,请参阅此处:http://docs.python-requests.org/en/master/user/quickstart/#more-complicated-post-requests
编辑:如果只有action
键应该是json字符串,您可以尝试以下操作:
import simplejson as json
requests.post('https://getpocket.com/v3/send', data={
'consumer_key': consumer_key,
'access_token': access_token,
'actions': json.dumps([{
'item_id':'1000000000',
'action':'archive'
}])
})
我建议simplejson
超过json
个套餐,因为它会更频繁地更新。
答案 1 :(得分:1)
从你的例子:
https://getpocket.com/v3/send?\
actions=[{"action":"archive","time":1348853312,"item_id":229279689}]&\
access_token=ACCESS_TOKEN&\
consumer_key=CONSUMER_KEY
我们看到有三个URL编码参数,只有一个,其中(actions
)是JSON值。你需要使用像
actions = {
"action": "archive",
"time": "1348853312",
"item_id": "229279689"
}
requests.post("https://getpocket.com/v3/send",
data={
"actions": json.dumps(actions),
"access_token": access_token,
"consumer_key": consumer_key
})
答案 2 :(得分:0)
似乎API要求参数位于网址上,但您要在帖子正文中发送。
您应该将字典编码为URL:
from urllib.parse import urlencode
data = {
'consumer_key' : consumer_key,
'access_token' : access_token,
'actions' : [{'item_id':'1000000000','action':'archive'
}
requests.post('https://getpocket.com/v3/send/?' + urlencode(data))