REST API,什么时候使用@PathParam、@QueryParam、@RequestBody、and/or @RequestHeader
REST API, when to use @PathParam, @QueryParam, @RequestBody, and/or @RequestHeader
如果有某种关于 when/when 不使用上述方法将信息传递给 REST 调用的标准,我一直在努力寻找答案。
我一直在到处寻找,但每个 post 只谈论所列方法中的 2 个或 3 个之间的区别,而不是全部 4 个。
1. @PathParam
PathParam 通常用于使用它的 id
获取资源。
例如。 /employees/{emp_id}
通常它是一个 HTTP 响应代码 404 如果你没有找到一个资源 id
作为 path param
.
2。 @QueryParam
QueryParam
通常用于使用除 id 之外的任何其他字段来访问实体。考虑“搜索”或“过滤器”而不是使用“id”来访问实体。在这种情况下,您将不得不期待一个实体数组作为响应,这与您将获得的单个实体作为将 id
作为 pathParam
发送的响应不同
例如。 /employees?firstname=joe
注意:QueryParam
也可以用于其他操作,例如sort
。例如。 /departments/123/employees?sort_by=salary
如果您没有通过搜索参数或过滤器参数找到任何实体,通常它是一个带有空数组作为响应的 http 响应代码 200 body。
3。 @RequestBody
通常是 POST、PUT 或 PATCH http 动词,我们将用它来发送请求body。
Why it's a bad idea to send requestbody with http GET
Why it's a bad idea to send requestbody with http DELETE
以下是我们使用RequestBody的情况
一个。状态突变
为了实现状态突变,通常 json/xml 实体所需状态的表示将作为 requestBody
和 POST/PUT/PATCH 动词发送。休息原则没有说 json 或 xml,它可以是任何东西;它可以是压缩的二进制格式,例如 protobuf、avro、cap'n'proto、flatbuffers 等,甚至是纯文本。
乙。 READ 操作(这些是 READ 不等同于 HTTP GET 的示例)
一个。 为了避免Loooong Urls - 如果参数需要GET一个
entity 太长了,我们一般会用request body 来发送,
而不是使用 url。 Http协议或Rest原则不限
你的 url 大小,但是一些浏览器对最大长度有限制
url.
What is the maximum length of a URL in different browsers?
b。 graphql - 在这里您将POST使用请求body进行查询
以您想要的格式获取数据
c。 安全原因 - 如果您必须发送机密数据,例如
password/tokens 获取一些数据,通常你必须 post 它
在请求 body 或 headers 中。 (为什么?因为,如果它在 url 中,
它很有可能最终出现在应用程序日志中)
4. @RequestHeader
一般用于发送元数据;不是实际实体 body(数据)。例如。 request-correlation-id、authheader、安全令牌等
5. @Matrixparam、@CookieParam 等
还有其他 not-so 流行的 HTTP 动词,例如 @Matrixparam and @CookieParam are out there in the JAX-RS spec. This is the Jersey documentation(请记住 Jersey 是 JAX-RS 的参考实现。您可能在 Spring 中找不到等效的东西)
其他有趣的相关读物
When to use @QueryParam vs @PathParam
What is the difference between @PathParam and @QueryParam
如果有某种关于 when/when 不使用上述方法将信息传递给 REST 调用的标准,我一直在努力寻找答案。
我一直在到处寻找,但每个 post 只谈论所列方法中的 2 个或 3 个之间的区别,而不是全部 4 个。
1. @PathParam
PathParam 通常用于使用它的 id
获取资源。
例如。 /employees/{emp_id}
通常它是一个 HTTP 响应代码 404 如果你没有找到一个资源 id
作为 path param
.
2。 @QueryParam
QueryParam
通常用于使用除 id 之外的任何其他字段来访问实体。考虑“搜索”或“过滤器”而不是使用“id”来访问实体。在这种情况下,您将不得不期待一个实体数组作为响应,这与您将获得的单个实体作为将 id
作为 pathParam
例如。 /employees?firstname=joe
注意:QueryParam
也可以用于其他操作,例如sort
。例如。 /departments/123/employees?sort_by=salary
如果您没有通过搜索参数或过滤器参数找到任何实体,通常它是一个带有空数组作为响应的 http 响应代码 200 body。
3。 @RequestBody
通常是 POST、PUT 或 PATCH http 动词,我们将用它来发送请求body。
Why it's a bad idea to send requestbody with http GET
Why it's a bad idea to send requestbody with http DELETE
以下是我们使用RequestBody的情况
一个。状态突变
为了实现状态突变,通常 json/xml 实体所需状态的表示将作为 requestBody
和 POST/PUT/PATCH 动词发送。休息原则没有说 json 或 xml,它可以是任何东西;它可以是压缩的二进制格式,例如 protobuf、avro、cap'n'proto、flatbuffers 等,甚至是纯文本。
乙。 READ 操作(这些是 READ 不等同于 HTTP GET 的示例)
一个。 为了避免Loooong Urls - 如果参数需要GET一个 entity 太长了,我们一般会用request body 来发送, 而不是使用 url。 Http协议或Rest原则不限 你的 url 大小,但是一些浏览器对最大长度有限制 url.
What is the maximum length of a URL in different browsers?
b。 graphql - 在这里您将POST使用请求body进行查询 以您想要的格式获取数据
c。 安全原因 - 如果您必须发送机密数据,例如 password/tokens 获取一些数据,通常你必须 post 它 在请求 body 或 headers 中。 (为什么?因为,如果它在 url 中, 它很有可能最终出现在应用程序日志中)
4. @RequestHeader
一般用于发送元数据;不是实际实体 body(数据)。例如。 request-correlation-id、authheader、安全令牌等
5. @Matrixparam、@CookieParam 等
还有其他 not-so 流行的 HTTP 动词,例如 @Matrixparam and @CookieParam are out there in the JAX-RS spec. This is the Jersey documentation(请记住 Jersey 是 JAX-RS 的参考实现。您可能在 Spring 中找不到等效的东西)
其他有趣的相关读物
When to use @QueryParam vs @PathParam
What is the difference between @PathParam and @QueryParam