POST请求大数据时,HTTP 201响应体应该是什么?

2 投票
1 回答
91 浏览
提问于 2025-04-14 16:38

我有一个用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 个回答

0

根据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头部中提供一个描述和/或链接到新资源就足够了。响应中的描述可以包括服务器接收到的数据长度,从而告知用户上传确实成功。

撰写回答