Python请求在post数据时给出415错误,除非数据={'key':'value'}

2024-04-23 18:51:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个直截了当的请求如下

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. 如果i注释掉data变量,则例程返回 status_code=415错误
  2. 如果在data变量中包含,则例程返回status_code=200成功

我试着在这里查找,例如: Python request gives 415 error while post data,但没有回答

问题是:为什么[1]失败而[2]奏效


Tags: httpsimporturldatadefstatuscodesome
2条回答

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

但是,服务器需要能够处理请求。如果它不喜欢您出于任何原因发送的内容,它可能会发回一个4xx状态码,或者不按照您的期望执行

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

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

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

或者通过显式指定标头:

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

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

我认为你把requests.post函数签名的文档和API文档弄错了。这意味着数据是一个关键字参数,而不是API选择性地获取数据

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

相关问题 更多 >