【问题标题】:Python request gives 415 error while post data unless data = {'key':'value'}Python 请求在发布数据时出现 415 错误,除非 data = {'key':'value'}
【发布时间】:2021-06-11 19:41:18
【问题描述】:

我正在做一个直接的请求,如下所示。

import requests

def user_transactions():
    url = 'https://webapi.coinfloor.co.uk/v2/bist/XBT/GBP/user_transactions/'
    
    data = {'key':'value'}
    r = requests.post(url, data=data, auth=("some_username", "some_password") )
    print(r.status_code)
    print(r.text)
    return

尽管data= 在文档中是可选的。 https://www.w3schools.com/python/ref_requests_post.asp

  1. 如果我注释掉data 变量,则例程返回一个 status_code=415 错误。
  2. 如果我在data 变量中包含,则例程返回status_code=200 成功。

我曾尝试查找此内容,例如这里: Python request gives 415 error while post data ,但没有答案。

问题是:为什么 [1] 失败但 [2] 有效?

【问题讨论】:

  • W3schools 不是“文档”,需要 data 参数。 The real docs
  • 我实际上也看过“真正的文档”,但不清楚,因此 w3schools 链接有一个很好的清晰表格(尽管你断言的内容不正确)并且很感激。
  • 我所断言的从 python 端是不正确的。但是,当您依赖服务器端响应您的空白请求时,python 端的重要性很小,它可能不喜欢。您必须考虑所有要求,而不仅仅是您的语言有或没有的要求。所以,当然,我的断言是不正确的,除非你仍然必须使用它。

标签: python python-requests


【解决方案1】:

是的,data 在 python 端是可选的。如您所见,requests 库将愉快地向服务器发送一个空请求。如果参数不是可选的,程序会在发送请求之前崩溃,所以不会有状态码。

但是,服务器需要能够处理请求。如果出于某种原因它不喜欢您发送的内容,它可能会发回 4xx 状态码,否则不会按照您的预期行事。

在这种情况下,它会抛出数据格式无效的错误。一个空的请求怎么可能是无效的格式?因为格式是在标题中指定的。如果您提供数据参数requests 将以urlencoded 格式发送数据,并在标头中指定数据的格式。如果数据为空,则请求将为空,但标头仍然存在。这个网站显然需要标头指定它知道的数据格式。

你可以通过两种方式解决这个问题,给一个空对象:

r = requests.post(url, data={}, auth=("some_username", "some_password") )

或者通过显式指定标题:

r = requests.post(url, auth=(...), headers={'Content-Type': 'application/x-www-form-urlencoded'})

旁注:您不应该使用 W3Schools 作为来源。它经常不准确,并且经常推荐不良做法。

【讨论】:

  • 我将此标记为正确,因为它是最完整的答案。作为记录,设置data={} 不起作用,而设置headers={'Content-Type': 'application/x-www-form-urlencoded'} 确实起作用。我的后续问题是我怎么知道不来这里使用哪个?
  • 您应该能够在您使用的任何 API 的 API 文档中找到它,或者在这种情况下只需阅读错误消息即可
【解决方案2】:

我认为您将 requests.post 函数签名的文档与 API 文档混淆了。这是说 data 是一个关键字参数,而不是 API 可选地获取数据。

这取决于您尝试使用的 API 端点。该端点必须要求数据随请求一起发送。如果您查看您正在使用的 API 的文档,它会提到有效请求需要发送的内容。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 2021-05-25
  • 1970-01-01
  • 2023-03-21
  • 2020-06-30
相关资源
最近更新 更多