我在Spring中设置了一个API,客户端可以在其中指定要接收的对象的ID。它返回对象的JSON列表(使用"type 1 count: " + Types[0].Count + "type 2: count: " Types[1].Count
注释)。
但是,由于请求可以是长列表,因此我将其设置为POST,并将其作为名为@ResponseBody
的对象接收(使用ProductRequest
注解)。这似乎不符合官方REST API标准,因为帖子是官方创建新对象的,但是以这种方式实现它似乎更好,因为你不会用一堆id混淆URL。另外,我可以指定自定义输出的其他参数。
所以我的问题是,这可以被视为有效的RESTful设计吗? Post并不是用来创建一个对象,所以它并不严格符合restful。思考?
答案 0 :(得分:1)
这是一个简单的GET请求。
@GetMapping(path = "/your-url")
public List<Object> method(@RequestParam(name="ids") List<Long> objectIds) {
}
您可以像简单的Java列表一样接收列表。
/api?ids=1,2,3
答案 1 :(得分:1)
你可以很好地做一个http POST到&#34;得到&#34;资源。有一些非常有效的例子,
GraphQL - 我们所做的就是将请求体中的一些查询发送(POST)到&#34; GET&#34;一些我们喜欢的格式的数据
假设您必须使用用户名和密码进行身份验证以获取特定数据,您将在GET请求中将其发送到Header中,或者您将执行POST以获取&#39; GET&#39;一个数据。
答案 2 :(得分:1)
不能溢出URL字符串允许的最大值吗?
实际上,URI的长度没有限制。但是,实际上,你可以遇到一些。
根据RFC7230(强调我的),
HTTP不会对请求行的长度设置预定义的限制,如第2.5节所述。接收比其实现的任何方法更长的方法的服务器应该使用
501 (Not Implemented)
状态代码进行响应。接收请求目标的服务器长于其希望解析的任何URI必须使用414 (URI Too Long)
状态代码进行响应。在实践中发现了对请求行长度的各种临时限制。建议所有HTTP发件人和收件人至少支持8000个八位字节的请求行长度。
它清楚地表明,在我们处理您的问题时,我们不能依赖请求行。
这可以被视为有效的RESTful设计吗?
由于上述限制,使用POST
是一种有效的解决方法。
这些问题的常见解决方法是使用
POST
而不是GET
并将参数存储在请求正文中。请求正文的长度限制通常远高于URL长度。
为了让您完全摆脱犹豫,有一个common non-standard header X-Http-Method-Override
。它请求Web应用程序使用标头中给出的方法覆盖请求中指定的方法:
X-Http-Method-Override: GET
我不确定Spring是否处理标题。虽然,它有HiddenHttpMethodFilter
过滤器似乎做类似的工作。