OpenFeign 发起 POST 请求

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 入门示例

发起 POST 请求

带参数 POST 请求

服务端代码:

@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);
}

调用结果:

image.png

带正文 POST 请求

服务端代码:

// 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);
}

调用结果:

image.png

注意:当 POST 请求出现错误时,OpenFeign 会根据响应状态码和配置进行相应的处理。例如,如果远程服务返回 400 Bad Request 状态码,Feign 默认会抛出feign.FeignException.BadRequest 异常。可以通过自定义 ErrorDecoder 来改变这种错误处理方式,以便更好地适应项目的需求。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号