JSON数组作为Python请求中的单个参数值

时间:2017-09-17 14:32:51

标签: python json python-requests

我正在学习处理请求和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文档"。

我的语法有什么问题吗?

3 个答案:

答案 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))