REST API,何时使用@PathParam,@ QueryParam,@ RequestBody和/或@RequestHeader

时间:2018-01-19 17:18:01

标签: java spring rest spring-boot restful-architecture

如果在何时/何时不使用上述将信息传递给REST调用的方法,我一直试图找到答案。

我一直在寻找各地,但每个帖子只讨论两种列出的方法之间的区别,或3,而不是全部4。

1 个答案:

答案 0 :(得分:6)

<强> 1。 @PathParam

PathParam通常用于使用它的id访问实体。 例如。 /employees/{emp_id}

如果您没有通过它的id作为路径参数找到实体,那么它通常是HTTP响应代码404。

<强> 2。 @QueryParam

QueryParam通常用于使用除id以外的任何其他字段来访问实体。想想“搜索”或“过滤”而不是使用“id”来到达实体。在这种情况下,您将不得不期望一组实体作为响应,而不像您将获得的单个实体作为发送id作为pathParam的响应

实施例。 /employees?firstname=joe

注意:QueryParam也可用于其他操作,例如sort。例如。 /departments/123/employees?sort_by=salary

如果您没有通过搜索参数或过滤器参数找到任何实体,那么通常它是一个http响应代码200,其中一个空数组作为响应主体。

第3。 @RequestBody

通常它是一个POST,PUT或PATCH http动词,我们将通过它发送请求者。

Why it's a bad idea to send requestbody with http GET

Why it's a bad idea to send requestbody with http DELETE

州突变

要实现状态变异,通常json / xml表示实体所需的状态将以​​requestBody的形式发送POST / PUT / PATCH动词。 Rest原则没有说json或xml,它可以是任何东西;它可以是压缩的二进制格式,如protobuf,avro,cap'n'proto等,甚至是纯文本。

READ操作(这些是READ不等同于HTTP GET的示例

  • 一个。 要避免Loooong网址 - 如果要获取GET所需的参数 实体太长了,我们通常会使用请求体来发送它, 而不是使用网址。 Http Protocol或Rest原则不限制 你在网址大小,但有些浏览器限制了最大长度 的网址。

    What is the maximum length of a URL in different browsers?

    graphql - 在这里,您将使用requestbody发布查询 以所需格式获取数据

    ℃。 安全原因 - 如果您必须发送机密数据等 密码/令牌来获取一些数据,通常你必须发布它 在请求正文或标题中。 (为什么?因为,如果它在网址中, 很可能它最终会出现在应用程序日志中)

<强> 4。 @RequestHeader

通常用于发送元数据;不是实际的实体(数据)。例如。 request-correlation-id,authheader等

<强> 5。 @Matrixparam,@ CookieParam等

在JAX-RS规范中还有其他不太流行的HTTP动词,如@Matrixparam和@CookieParam。这是Jersey documentation(请记住,Jersey是JAX-RS的参考实现。你可能会或者可能不会在Spring中找到相同/等效的东西)

其他有趣的相关链接

When to use @QueryParam vs @PathParam

What is the difference between @PathParam and @QueryParam

HTTP POST with URL query parameters -- good idea or not?

How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?