POST请求大数据时,HTTP 201响应体应该是什么?
我有一个用Python的FastAPI搭建的服务器,我正在通过一个POST
请求向服务器发送大量数据(大约2GB)。一旦服务器处理完这个请求,我想给客户端返回一个201 "Created"
的响应。
根据规定,201
的响应应该有内容,所以我不能发送一个空的响应体(https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST),但同时,我不想把新创建的资源发送回去,因为它太大了,而且在POST
请求的时候,客户端并不需要这个资源。另一方面,我也想用204 "No Content"
来回应,但这似乎不是成功的POST
请求推荐的响应。
所以假设我发送了一个201
的响应,那么响应的内容应该是什么,以避免无缘无故地发送大数据回去呢?
下面是一个简单的代码示例,描述了我的问题,目前返回的是一个201
的响应,但没有内容:
from fastapi import FastAPI, HTTPException, Response, status
app = FastAPI()
@app.post("/data", status_code=status.HTTP_201_CREATED)
async def send_data(data, response: Response):
try:
# process data on the server
# ...
pass
except Exception as e:
raise HTTPException(status.HTTP_500_INTERNAL_SERVER_ERROR, e)
return response # response with empty body
1 个回答
根据MDN文档
201 Created
HTTP状态码
201 Created
表示请求成功,并且已经创建了一个资源。在发送响应之前,新的资源或者对新资源的描述和链接实际上已经创建好了。新创建的内容会在消息的主体中返回,位置可以是请求的URL,或者是在Location
头部中的URL。这个状态码常见的使用场景是作为
POST
请求的结果。
同样,在RFC 9110: HTTP语义中也有描述
201 (Created)
状态码表示请求已经被满足,并且创建了一个或多个新资源。请求创建的主要资源通过响应中的Location
头部字段来识别,或者如果没有收到Location
头部字段,则通过目标URI来识别。201响应的内容通常描述并链接到创建的资源。响应中发送的任何验证字段(第8.8节)传达了请求创建的新表示的当前验证器。需要注意的是,PUT方法(第9.3.4节)有额外的要求,可能会限制发送这样的验证器。
因此,简单来说,实际上并不一定需要将创建的资源的实际数据返回给客户端,而是在Location
头部中提供一个描述和/或链接到新资源就足够了。响应中的描述可以包括服务器接收到的数据长度,从而告知用户上传确实成功。