HTTP POST 请求是超文本传输协议(HTTP)中的一种请求方法。它用于向指定的资源提交要被处理的数据。与 GET 请求不同,POST 请求的数据通常包含在请求体(request body)中,而不是像 GET 请求那样将数据附加在 URL 后面。这使得 POST 请求更适合用于发送敏感信息(如用户密码)或大量数据,因为数据不会在 URL 中暴露。
@PostMapping 是 Spring 框架(包括在 OpenFeign 中使用)中的一个注解,用于将 HTTP POST 请求映射到特定的处理方法上。它是 @RequestMapping(method = RequestMethod.POST) 的一个快捷方式,使得在定义 RESTful API 端点或者调用外部服务(如在 OpenFeign 客户端中)时更加简洁。
注意:完整代码请参考 Spring Cloud OpenFeign 入门示例。
服务端代码:
@PostMapping("/post") public String post(@RequestParam("id") Long id) { return "appName=" + appName + " appPort=" + appPort + " id=" + id; }
定义 Feign 客户端:
// 定义 POST 请求,接收一个请求参数 @PostMapping("/simple/post") String post1(@RequestParam("id") Long id);
调用 Feign 客户端:
@GetMapping("/demo4") public String demo4(@RequestParam("id") Long id) { return simpleFeign.post1(id); }
调用结果:
服务端代码:
// POST 请求,创建新用户 @PostMapping("/createUser") public CommonReturn<User> createUser(@RequestBody User user) { log.info("createUser() user={}", user); USERS.add(user); return CommonReturn.success(user).ext(appName, appPort); }
定义 Feign 客户端:
// 定义 POST 请求,接收一个 Java 对象 @PostMapping("/user/createUser") CommonReturn<User> post2(@RequestBody User user);
代码说明:
@PostMapping("/user/createUser") 和服务提供方的对应注解作用相同,用于指定要调用的远程服务的路径和请求方法。
@RequestBody User user 同样用于从请求体中获取数据,并将其作为参数传递给远程服务的 createUser 方法。
注意:在使用 @PostMapping 时,RequestBody 注解后的参数类型决定了请求体的数据格式。如果是简单的对象(如上述示例中的 Map),数据将以对象的序列化格式发送。如果是自定义的 Java 类,需要确保该类有合适的序列化(如 JSON 序列化)机制,否则可能导致数据传输错误。
调用 Feign 客户端:
@GetMapping("/demo5") public CommonReturn<User> demo5(@RequestParam("id") Long id, @RequestParam("name") String name, @RequestParam("age") Integer age) { User user = User.builder().id(id).name(name).age(age).build(); return simpleFeign.post2(user); }
调用结果:
注意:当 POST 请求出现错误时,OpenFeign 会根据响应状态码和配置进行相应的处理。例如,如果远程服务返回 400 Bad Request 状态码,Feign 默认会抛出feign.FeignException.BadRequest 异常。可以通过自定义 ErrorDecoder 来改变这种错误处理方式,以便更好地适应项目的需求。