Netflix Feign @Body 注解

在 Netflix Feign 中,@Body 注解用于指定一个方法参数作为 HTTP 请求的主体内容。它允许你将一个 Java 对象转换为合适的格式(如 JSON、XML 等)并作为请求体发送到目标服务端点。这在进行 POST、PUT 等需要发送请求体的 HTTP 操作时非常有用,能够清晰地定义请求数据的来源。

应用示例

假设有一个服务接受一个 User 实体,并且返回一个 User 实体。步骤如下:

(1)定义 User 实体

@Data
@Builder
@ToString
public class User {
    private Long id;
    private String name;
    private Integer age;

    public User() {}

    public User(Long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

(2)服务接口

@PostMapping("/body2")
public User body2(@RequestBody User user) {
    return user;
}

(3)定义 Feign 客户端

@RequestLine("POST /simple/body2")
@Headers("Content-Type: application/json")
@Body("{body}")
User body2(User user);

注意,如果要传递和接受对象,我们需要在通过 create() 方法创建 Feign 客户端中定义 Encoder 和 Decoder,如下:

static SimpleFeign createJson() {
    return Feign.builder()
            .encoder(new JacksonEncoder())
            .decoder(new JacksonDecoder())
            .contract(new Contract.Default())
            .target(SimpleFeign.class, "http://localhost:8090");
}

(4)调用 Feign 客户端

@GetMapping("/")
public String index() {
    return SimpleFeign.createJson().body2(User.builder().id(100L).name("Tom").age(20).build()).toString();
}

输出结果如下:

8360090a209a7c4d34958de4e638d7ef_1730437823447-4a58a220-c55a-4835-b547-ca26038a32c6.png

源码分析

下面是 @Body 注解源码:

package feign;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Body {
    String value();
}

在 @Body 注解中,value 是唯一的一个属性,其返回值类型为 String。当我们在方法上使用 Body 注解时,通过给 value 属性赋值,就可以指定该方法所发起的 HTTP 请求体的内容。例如:

@RequestLine("POST /simple/body2")
@Headers("Content-Type: application/json")
@Body("{\"id\":100, \"name\":\"Tom\", \"age\":20}")
User body3();

当然,也可以通过“{变量}”的方式:

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