% 不支持的操作数类型:'dict' 和 'unicode'

unsupported operand type(s) for %: 'dict' and 'unicode'

我正在使用 python python 请求连接 api。
api 的示例连接是

curl -H"Authorization:Bearer <token>"-H"Content-Type: application/json" -d '{"filter" :{}}'https://sandbox-api.flipkart.net/sellers/orders/search

我的代码是:

import requests

class FlipkartAPI:
    def __init__(self, token):
        self.token = token

    def search_orders(self):
        headers = {'Authorization':'Bearer %s',
                'Content-Type':'application/json'} % self.token
        url = "https://api.flipkart.net/sellers/orders/search"
        return requests.get(url, params = headers)

变量token是unicode类型。
我的代码有什么问题?
编辑: 我获取订单的代码:

from auth import Authentication
from api import FlipkartAPI

app_id = 'app id'
app_secret = 'app secret'

auth = Authentication(app_id, app_secret)
get_token = auth.get_access_token()
token_str = get_token.json()
token = token_str['access_token']

fk = FlipkartAPI(token)
orders = fk.search_orders()
print orders

我可以生成一个令牌,这意味着我的应用程序 ID 和应用程序密码是正确的,并且我已获得访问权限。 还有 link 到 api 文档:

Flipkart Documentation

您需要将 % 操作应用于格式占位符 的 字符串,而不是字典:

headers = {'Authorization':'Bearer %s' % self.token,
           'Content-Type':'application/json'}

您还使用了错误的关键字参数、错误的 HTTP 方法,并且没有设置 JSON 负载。

  • 使用headers,而不是params
  • use POST,curl -d 开关表示发出了 POST 请求,而不是 GET
  • 你忘了提供 JSON 正文 filter

curl 命令的正确翻译是:

headers = {'Authorization':'Bearer %s',
        'Content-Type':'application/json'} % self.token
url = "https://api.flipkart.net/sellers/orders/search"
filter = {'filter': {}}

return requests.post(url, json=filter, headers=headers)

json 参数已添加到 requests 版本 2.4.2;如果您使用的是旧版本,则需要自己对 JSON 正文进行编码:

import json

# ...

return requests.post(url, data=json.dumps(filter), headers=headers)