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

问题描述 投票:0回答:2

我有一个使用 Python 中的 FastAPI 实现的服务器,并且我通过 POST 请求向服务器发送大数据(~2 GB)。一旦请求在服务器端得到处理,我想向客户端返回 201“已创建”响应。 201 响应应该有一个正文,所以我不应该发送一个空正文的响应(https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST),但在同时,我不想发回新创建的资源,因为它太大了,并且客户端在 POST 请求时不需要该资源。或者,我很想回复 204“无内容”,但这似乎不是成功 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
python http fastapi httpresponse
2个回答
0
投票

https://fastapi.tiangolo.com/reference/response/根据文档,你不能只根据需要设置response.body(或response.content)和response.status_code并返回它


0
投票

根据MDN文档

201 已创建

HTTP

201 Created
成功状态响应码表示请求已成功并已导致创建 的资源。新资源,或新资源的描述和链接 资源,在发送回响应之前有效创建,并且 新创建的项目将在消息正文中返回, 位于请求的 URL 或值中的 URL
Location
标题。

此状态代码的常见用例是以下结果:

POST
请求。

类似地,如RFC 9110:HTTP 语义

中所述

201 (Created)
状态码表示请求已被处理 已实现并导致创建一种或多种新资源。 请求创建的主要资源由 标识 响应中的
Location
标头字段,如果没有
Location
标头字段由目标 URI 接收。

201 响应内容通常描述并链接到 创建资源。发送的任何验证器字段(第 8.8 节) 响应传达新表示的当前验证器 由请求创建。请注意,PUT 方法(第 9.3.4 节)具有 可能会阻止发送此类验证器的附加要求。

因此,简而言之,“实际上不必将创建的资源的实际数据”返回给客户端,而在 Location 标头中提供新资源的描述和/或链接就足够了。响应中的描述等可以包括服务器接收到的数据的长度,从而通知用户上传确实成功。

    

© www.soinside.com 2019 - 2024. All rights reserved.