几种获取 Spring Framework 控制器中请求参数的方法
Table of Contents
1 请求参数
在 HTTP 请求中往往有多种请求参数,在 Spring Framework 中的请求参数都是放在如下 所示的包中
import org.springframework.web.bind.annotation.*;
下面是处理几种常见请求的控制器的方法:
2 URI 路径请求
GET /orders/121233
上面是请求 orderId=121233 的订单的 RESTFul API。这里的请求参数位于 URL 的路径 上,可以使用如下代码片段获取参数的值
@GetMapping("/orders/{orderId}") public Order getOrder(@PathVariable long orderId) { }
3 URI 的请求参数
GET /orders?status=ready
上面是请求所有状态一个就绪的订单,可以使用如下代码片段获取请求参数的值
@GetMapping("/orders") public List<Order> getOrdersList( @RequestParam(value="status", required=false, defaultValue="idle") String orderStatus) { }
4 GET 的 Query 字符串中的参数
GET /orders?name=new&total=10
上面的 GET 请求中的 Query 字符串为 name=new&total=10
,可以理解成一系列的键
值对,所以可以使用如下代码来将其转化成 Java 的 Map 对象
@GetMapping("/orders") public List<Order> getOrdersList(@RequestParam Map<String, Object> params) { }
使用 @RequestParam
的好处是可以直接在控制器中是 Map,而不需要使用额外转化成
Map 的冗余代码
5 POST 请求体里面的 JSON 参数
POST /orders #################### body #################### { "name": "new", "total": 10 }
上面的 POST 请求中使用了 JSON 字符串作为请求的消息体,可以使用如下的方式来获取 消息体中的参数
@ResponseStatus(HttpStatus.CREATED) @PostMapping("/orders") public Order postOrders(@RequestBody Map<String, Object> params) { }
当定义的 RequestBody 是一个 Map 数据结构后,直接可以将请求体中的 JSON 数据体构 造成 Java 的 params 对象
6 HttpServletRequest 对象
有时候,我们希望直接获取到请求的对象实例,这样就可以调用
request.getRequestURI()
来动态获取请求的相对路径,实现动态响应请求,Spring
Framework 提供了一个有效的手段,那就是直接把 HttpServletRequest 对象作为对象传
入请求方法中
import javax.servlet.http.HttpServletRequest; @RestController public class ProxyOrderController { @GetMapping("/orders/**") public Object getOrders(HttpServletRequest request) { } }
7 请求头
获取所有的请求头
import org.springframework.http.HttpHeaders; @RestController public class ProxyOrderController { @GetMapping("/orders/**") public Object getOrders(@RequestHeader HttpHeaders headers) { } }
获取特定的请求头
@RestController public class ProxyOrderController { @GetMapping("/orders/**") public Object getOrders(@RequestHeader("User-Agent") String ua) { } }