REST API: 使用带有请求体的GET请求
REST API: 使用带有请求体的GET请求
我想实现一个REST API,并且需要在我的GET请求中包含一个body。(就像在这里讨论的一样:HTTP GET with request body)\n有没有一些无法在GET请求中发送body的HTTP客户端?Fiddler可以做到,尽管消息框是红色的。
REST API是一种常用的Web服务架构,它使用HTTP协议来进行通信。在REST API中,GET请求常用于获取资源的信息,而且通常不应该包含请求体(body)。然而,在某些情况下,我们可能会面临需要在GET请求中发送请求体的问题。
那么,为什么会出现需要在GET请求中发送请求体的情况呢?我们可以通过上面的代码片段来了解原因和解决方法。
原因:
在某些情况下,由于特殊的业务需求或限制,我们可能需要在GET请求中发送一些数据给服务器。然而,由于GET请求的规范和HTTP协议的限制,GET请求通常不支持发送请求体。因此,我们需要找到一种解决方法来绕过这个限制。
解决方法:
上面的代码片段展示了一种解决方法,即通过将请求方法设置为POST,发送请求体,然后再将请求方法重置为GET来绕过限制。具体来说,代码首先将HTTP请求的方法设置为POST,然后使用httpRequest.WriteBytes(bytes);
将请求体写入请求中,最后再将请求方法重置为GET。这样,尽管我们发送的是GET请求,但是我们仍然能够在请求中包含请求体。
通过这种方法,我们可以绕过GET请求不能包含请求体的限制,但是需要注意的是,这种做法可能不符合REST API的规范和最佳实践。因此,在使用这种方法时,我们应该谨慎考虑,并确保了解服务器端对于GET请求中包含请求体的处理方式。
当我们面临需要在GET请求中发送请求体的情况时,我们可以通过设置请求方法为POST,发送请求体,然后重置请求方法为GET的方式来解决这个问题。然而,需要注意的是这种做法可能不符合REST API的规范,因此在实际应用中需要慎重考虑。
REST API:GET请求中使用body的原因及解决方法
在HTTP GET请求中使用body是一个不好的主意。尽管“de jure”HTTP GET可以有body,但从实际上来看,你会遇到一些问题:
1. 客户端框架/库的问题。很难找到对此的支持。
2. 服务器可能会忽略GET请求的body。无论如何,这不是标准的方式,可能会出现与服务器或其配置相关的问题。
3. 这使得你的代码,特别是在服务器端,对其他人来说不够清晰,因为没有人会预料到GET请求会有body。
你在寻找困难的方式吗?使用带有body的GET请求会有很多陷阱。为什么不使用其他HTTP动词呢?
例如,使用POST(或其他一些动词),然后:
1. 很容易使用现有的客户端库。
2. 没有服务器或服务器配置的问题。
3. 对其他人来说更加清晰。
不要寻找更困难的方式 🙂
请问你能证明“不管怎样,这不是标准的方式”吗?你指的是哪个“标准”?
我指的是HTTP标准和RFC文件,例如http://tools.ietf.org/html/rfc2616。带有body的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.
GET规范在5.1.1中似乎没有“不允许”。
Stoynev,POST消息是否应该返回复杂对象的body?
为什么不使用其他HTTP动词?因为许多现有的第三方API对协议违规一无所知..要求在GET方法中将有效载荷作为body发送。
REST API: GET请求中包含请求体的原因和解决方法
在REST中,通常的规则是将任何参数都发送到URL中。正如你提到的问题的答案所指出的那样,这是可行的,但它忽略了REST的要点,即拥有一致的网络接口。如果你想向端点传递复杂的数据,你可能希望使用POST,因为用户会期望它具有请求体。我强烈建议重新考虑这种实现方法。
但是对于你的实际问题,确实有一些客户端无法在GET请求中发送请求体的情况。我想大多数情况下,你的客户端将是以编程方式进行访问的,比如Python的urllib2,虽然你可以在GET请求中设置请求体,但这并不是该模块的预期用法,所以你强迫程序员去做一些奇怪的事情。更重要的是,REST API的设计理念是客户端无关的,这就是为什么我觉得你的API设计在这里应该进行重新调整。
是的,这将是我的第二选择。的确,在GET请求中使用请求体不完全符合REST的原则,但这是必要的。URL的长度是有限的,并且在处理复杂数据时往往会遇到问题。如果无法使用GET,我会使用POST,但用户期望使用POST来创建数据,使用GET来获取数据。然而,我没有看到其他选择。
我理解你的观点,但我认为对用户来说,将POST端点想象成一个处理复杂XML/JSON数据并返回结果的服务提供者,会比创建一个非标准的GET请求更容易理解。POST经常以这种方式使用,而GET则不是。
有人能指出支持"GET在REST中...参数发送到URL中"这一说法的任何Web RFC或其他文档吗?我在Roy Fielding的论文中没有看到这一点,但我可能遗漏了。我宁愿不基于一个Stack Overflow的答案做决策,并与其他人分享这个惯例,尽管答案是有力的。(顺便说一句+1)
根据HTTP规范中的描述:"GET方法意味着检索由请求URI标识的任何信息(以实体的形式)"(我强调了一下)所以可以推断参数在URI中,而不是在请求体中,因为"POST方法用于请求源服务器接受请求中包含的实体"(同上引用)。