【问题标题】:REST API: GET request with bodyREST API:获取带有正文的请求
【发布时间】:2012-06-18 21:14:00
【问题描述】:

我想实现一个 REST API,并且我的 GET 请求需要一个正文。 (就像这里讨论的:HTTP GET with request body)

是否存在无法通过 GET 请求发送正文的 http 客户端? Fiddler 可以做到,虽然消息框是红色的。

【问题讨论】:

    标签: .net rest asp.net-web-api http-get frombodyattribute


    【解决方案1】:

    作为一般规则,REST 中的 GET 想法是您的任何参数都在 URL 中发送。正如您所包含的问题的答案所表明的那样,它是可行的,但错过了 REST 的要点,即拥有一致的 webbish 界面。如果您想将复杂的数据传递到您的端点,您可能需要使用 POST,您的用户会期望它有一个正文。我强烈建议重新考虑该实施。

    但是对于您的实际问题,确定有些客户端无法通过 GET 发送正文。大多数情况下,我会想象您的客户将是编程的,例如 python 的 urlib2,虽然您可以在 GET 上设置一个主体,但这并不是该模块的真正预期用途,因此您正在强制程序员变得奇怪。更重要的是,REST api 的理念是与客户端无关,这就是为什么我觉得您的 API 设计应该在这里重新设计。

    【讨论】:

    • 是的,这将是我的第二选择。确实,在 GET 请求上使用 body 并不完全平静,但它是必要的。 URL 长度是有限的,并且经常遇到复杂数据的问题。如果 GET 不可能,我将使用 POST,但用户会期望 POST 用于创建和 GET 用于检索数据。但是,我看不到其他选择。
    • 我明白这一点,但我认为用户将 POST 端点想象为处理其复杂 XML/JSON 数据并以结果响应的服务提供者的感觉比它更不突变将创建一个非标准的 GET 请求。 POST 经常以这种方式使用,GET 不是。
    • 任何人都可以指向任何支持“在 REST 中获取...参数在 URL 中发送”语句的 Web RFC 等吗?我在 Roy Fielding 的论文中没有看到它,但我可能会错过它。我不想将我的选择建立在 SO 答案的基础上,而是与其他人分享这个约定,尽管答案可能是有说服力的。 (+1 顺便说一句)
    • 来自HTTP spec:“GET 方法意味着检索任何信息(以实体的形式)由 Request-URI 标识。”(强调我的)因此,参数在 URI 中,而不是在正文中,因为“POST 方法用于请求源服务器接受 请求中包含的实体”-同上
    • @stom 在这种情况下,“客户端不可知论”的意思是“无论哪个特定客户端”。也就是说,无论是通过 CURL、python 脚本、Firefox 还是任何其他能够发出 HTTP 请求的客户端访问 REST api。
    【解决方案2】:

    在 GET HTTP 请求中使用正文是个坏主意。是的,似乎“法律上”的 HTTP GET 可以有正文,但“事实上”你会遇到问题:

    1. 使用客户端框架/库。很难找到它的支持。
    2. 服务器可以忽略 GET 请求的主体。无论如何,这不是标准方式,可能是服务器或其配置问题。
    3. 它会使您的代码(尤其是服务器端的代码)对其他人不清楚,因为没有人会期望 GET 带有正文。

    你在寻找艰难的道路吗?使用带有身体的 GET,您将遇到很多陷阱。为什么不使用其他 HTTP 动词?

    例如使用 POST(或其他动词),比:

    1. 准备好客户端库很容易,
    2. 服务器或服务器配置没有问题,
    3. 其他人很清楚

    不要寻找更难的方法:)

    【讨论】:

    • 您能否证明“无论如何这不是标准方式”,请。你指的是什么“标准”?
    • 我指的是 HTTP 标准和 RFC 文件,例如tools.ietf.org/html/rfc2616 。带有正文的 HTTP GET 请求是非标准的
    • 嗯,HTTP 1.1 似乎允许 GET 请求的消息体(通过不禁止它):A message-body MUST NOT be included in a request if the specification of the request method (section 5.1.1) does not allow sending an entity-body in requests. 5.1.1 中的 GET 规范似乎没有“不允许”。
    • @G.Stoynev,POST 消息是否应该返回复杂对象主体?
    猜你喜欢
    • 2017-03-19
    • 2020-07-12
    • 2019-12-01
    • 1970-01-01
    • 2017-01-21
    • 2022-01-23
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    相关资源
    最近更新 更多