spring-cloud-feign - feign如何获取所请求接口(interface)的头数据

标签 spring-cloud-feign feign

我正在请求与 feign 的接口(interface)并需要获取该接口(interface)的 Headers 值。

我用过feign对于请求的接口(interface)header传递参数之前,将token传递给headers:

@RequestMapping(method = RequestMethod.GET, value = "/api/get-store-list")
List<Store> getStoreList(@RequestHeader("Authorization") String Authorization);

但是这个接口(interface)将数据量放在了header的x-total-count中,所以我还是需要获取x-total-count的值。 如何获取x-total-count的值。

最佳答案

Feign 在 Response 对象中具有 header ,这可以是返回值:

public interface Swapi {
    @RequestLine("GET /people/{id}/")
    Response personResponse(@Param("id") int person);
}

现在您可以对结果调用headers()。当然,这会让你的 body 变成一根绳子,这并不漂亮。让我们尝试一些更像 Feign 的东西。


@Data
public class Person {
    String name;
    int height;
    int mass;
}

public interface Swapi {
    @RequestLine("GET /people/{id}/")
    Person person(@Param("id") int person);
}

现在 header 再次隐藏,但解码器仍然可以使用它们,这就是我将插入的位置:

@RequiredArgsConstructor
public class HeaderReadingDecoder implements Decoder {

    private final Decoder wrappedDecoder;

    @Override
    public Object decode(Response response, Type type) throws IOException {
        var server = response.headers().getOrDefault("server",
            List.of("")).iterator().next();
        System.out.println("server = " + server);
        var etag = response.headers().getOrDefault("etag",
            List.of("")).iterator().next();
        System.out.println("etag = " + etag);
        return wrappedDecoder.decode(response, type);
    }
}

当然,System.out 是邪恶的,但我真的不知道你想用这个 header 值做什么。由你决定。现在您可以将其用于:

Swapi swapi = Feign.builder()
    .decoder(new HeaderReadingDecoder(new JacksonDecoder()))
    .target(Swapi.class, "https://swapi.co/api");
Person person = swapi.person(2);
System.out.println("person = " + person);

你会得到:

server = cloudflare
etag = "3a58f420395ff0deed943e331d3bf74b"
person = Person(name=C-3PO, height=167, mass=75)

关于spring-cloud-feign - feign如何获取所请求接口(interface)的头数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57215583/

相关文章:

java - 以编程方式创建 Feign 客户端和 Eureka 目标

spring-cloud-feign - Feign ErrorDecoder : retrieve the original message

java - 是否可以在没有功能区的情况下使用@FeignClient?

java - spring cloud feign hystrix 回退不起作用

java - Spring Rest API 与 Feign 客户端和可分页

java - 将 Spring Boot 1.x 中的 netflix feign 迁移到 Spring Boot 2.x 中的 openfeign

spring-boot - FeignClient 和 Spring boot 的循环依赖不明确

java - 父ID未保存在子表Spring JPA2 @OneToMany关系中

spring-mvc - 如何使用 Spring Cloud Feign 发布表单 url 编码的数据