【问题标题】:PUT request via postman works, but via python requests not通过邮递员的 PUT 请求可以工作,但不能通过 python 请求
【发布时间】:2021-09-21 02:18:47
【问题描述】:

当我通过邮递员发送 PUT 请求时一切正常,但是当我将代码从邮递员复制到 python 时,我得到了这个:

{"code": 50035, "errors": {"_errors": [{"code": "CONTENT_TYPE_INVALID", "message": "Expected \"Content-Type\" header to be one of {'application/json'}."}]}, "message": "Invalid Form Body"}

代码:

url = "https://discord.com/api/v9/guilds/860859559908474900/premium/subscriptions"

payload={'user_premium_guild_subscription_slot_ids': '853228009795223572'}
files=[

]
headers = {
  'authorization': 'here token',
  'Cookie': '__dcfduid=c5cbabf10a8344558c8c4b90a6e306e2'
}

response = requests.request("PUT", url, headers=headers, data=payload, files=files)

print(response.text)

如果我将 'content-type' : 'application/json' 添加到标题中,我会得到:

{"message": "400: Bad Request", "code": 0}

【问题讨论】:

  • 您应该包含正确的内容类型,然后然后找出导致下一个错误 (400) 的原因。
  • 内容类型应用程序-Json.

标签: python api python-requests postman put


【解决方案1】:

要么使用json= 而不是data=,要么添加Content-Type 标头,其值为application/json,就像服务器告诉你的那样。

还要检查Authorization 标头,主要是有一个前缀提到要使用的身份验证,例如:

Authorization: Basic base64-encoded(user:pass)
Authorization: Bearer token
Authorization: Token token

并确保 API 实际允许 files 参数为空,如果不允许,请尝试将其删除。

然后是您提供的__dcfduid cookie。一些 cookie 往往是动态的,因为请求之间的值变化。然后尝试建立会话并在其中执行登录部分:

import requests as r
ses = r.Session()
resp = ses.post(<login to the API>)
print(resp.text)
ses.put(
    url="https://discord.com/api/v9/guilds/860859559908474900/premium/subscriptions",
    headers={
        'Authorization': 'here token',
        # cookies are in the ses object
    },
    json={
        'user_premium_guild_subscription_slot_ids': '853228009795223572'
    },
    # if required
    files=[...]
)

【讨论】:

  • 如果我使用 json= 而不是 data= 我会收到此错误:pastebin.com/raw/gnb6zHH0(将其粘贴在这里很长)并且如果我添加 'content-type' : 'application/json'标题,我得到这个:{"message": "400: Bad Request", "code": 0} 但如果我使用 json= 并添加 'content-type' : 'application/json' 我也会得到这个错误pastebin.com/raw/gnb6zHH0
  • @1bura 所以你已经更近了一步 - 长消息越来越接近成功响应。从它所说的(SET_TYPE_ALREADY_CONTAINS_VALUE)来看,您传递的任何数据显然都已经配置好了。尝试手动删除它们,然后调用 API。
  • 它写的是 SET_TYPE_ALREADY_CONTAINS_VALUE 但它不是真的,查看这个视频youtube.com/watch?v=WpyyJH1mc9M(是的,我知道它在那里的授权令牌,我只是不需要它,它是我的测试令牌,你可以接受)跨度>
猜你喜欢
  • 2016-07-03
  • 2022-01-09
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 2018-05-10
相关资源
最近更新 更多