REST API:使用正文获取请求

use*_*899 22 .net rest http-get asp.net-web-api frombodyattribute

我想实现一个REST API,并且在我的GET请求上需要一个正文.(如下所述:带请求主体的HTTP GET)

是否有http客户端无法发送带有GET请求的正文?Fiddler能够做到这一点,虽然消息框是红色的.

Ben*_*Ben 29

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

但对于您的实际问题,确定有客户无法在GET上发送正文.大多数情况下,我认为你的客户端将是程序化的,比如python的urlib2,虽然你可以在GET上设置一个主体,但它并不是模块的预期用途,所以你迫使程序员变得奇怪.更重要的是,REST api的想法是与客户端无关,这就是为什么我觉得你的API设计应该在这里重新设计.

  • 我明白了这一点,但我认为用户将POST端点想象成一个处理复杂XML/JSON数据并响应结果的服务提供者,而不是创建一个非标准的GET请求.POST经常以这种方式使用,而GET则不然. (5认同)
  • 是的,这将是我的第二选择。的确,在GET请求上使用主体不是完全可以放松的,而是必要的。URL长度有限,并且经常遇到复杂数据问题。如果没有GET的可能性,我将使用POST,但用户会期望POST用于创建,而GET则用于检索数据。但是,我没有其他选择。 (2认同)

Reg*_*for 9

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

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

你在寻找艰难的方式吗?随着身体的GET,你会遇到很多陷阱.为什么不使用其他HTTP动词?

例如,使用POST(或其他一些动词),而不是:

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

不要寻找更难的方式:)

  • 好吧,HTTP 1.1似乎允许消息体用于GET请求(通过不禁止它):`如果请求方法的规范(第5.1.1节)不允许发送,则消息体不得包含在请求中请求中的实体主体.5.1.1中的GET规范似乎并不"不允许". (2认同)