For Restful API, can GET method use json data?
我不希望在URI中看到如此长的参数字符串。 那么,GET方法可以使用json数据吗?
在我的情况下,我需要过滤给定种类的参数。 如果有很多参数,则长度可能超过URI的限制。 那么,这个问题是否有最佳实践?
-
每周至少一次询问此问题。 始终相同的两个对手被提议作为答案:1)是的,GET与请求主体是RESTful,2)不,它不是。 我们都不会从一次又一次写下我们的oppinions中学到任何新东西。 现在我投票关闭这个问题,因为它是重复的。 它也应该被关闭,因为答案主要是基于意见的。
从理论上讲,没有什么可以阻止您在GET请求中发送请求正文。 HTTP协议允许它,但没有定义的语义,因此您可以记录客户端发送GET有效负载时将要发生的确切情况。例如,您必须定义JSON主体中的参数是否等同于查询字符串参数或其他完全相同的参数。
但是,由于没有明确定义的语义,因此您无法保证应用程序与客户端之间的实现会尊重它。服务器或代理可能会拒绝整个请求,或忽略正文或其他任何内容。处理破坏的实现的REST方法是以与应用程序分离的方式规避它,所以我说你有两个选项可以被认为是最佳实践。
简单的选择是使用POST而不是其他答案推荐的GET。由于POST未通过HTTP标准化,因此您必须记录该应该如何工作。
我更喜欢的另一个选择是实现您的应用程序,假设GET有效负载永远不会被篡改。然后,如果某些内容的实现中断,您允许客户端使用X-HTTP-Method-Override覆盖HTTP方法,这是客户端使用POST模拟HTTP方法的常用约定。因此,如果客户端具有损坏的实现,它可以将GET请求写为POST,发送X-HTTP-Method-Override: GET方法,并且您可以使用与应用程序实现分离的中间件并相应地重写该方法。如果你是纯粹主义者,这是最好的选择。
-
您如何看待stackoverflow.com/a/983458/1907906?
-
@Tichodroma Fielding说的完全一样。 GET主体没有HTTP协议定义的解析语义,但这并不意味着它在使用HTTP作为传输协议的REST API中无用。 它只意味着它与传输协议本身无关,并且可能不被某些实现所尊重。
要回答您的问题,是的,您可以在URI中传递JSON作为GET请求的一部分(如果您使用URL编码)。但是,考虑到这样做的原因是由于URI的长度,使用JSON将会弄巧成拙(引入的字符多于所需的字符数)。
我建议您以POST常规CGI样式(param1=val1¶m2=val2)或JSON(在收到时由API解析)发送POST请求正文中的参数
-
这样的请求是RPC over HTTP。 它不是RESTful。
-
@Tichodroma抱歉,但这完全错了。 如果他将调用指向由URI标识的资源,使用HTTP协议定义的方法,并使用目标资源定义的POST语义,那么它不是RPC。 它也可能不是REST,但它不是RPC。 如果JSON有效负载包含标识符 - 而不是URI - 以及要使用的方法 - 而不是依赖于HTTP方法语义,那么它将是RPC。