feign如何获取请求接口的头数据

时间:2019-07-26 07:56:52

标签: spring-cloud-feign feign

我正在请求一个与feign的接口,并且需要获取该接口的Headers值。

我之前使用feign作为请求的接口头传递参数,然后将令牌传递给头:

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

但是,此接口将数据量放入标头的x-total-count中,因此我仍然需要获取x-total-count的值。 如何获得x-total-count的值。

1 个答案:

答案 0 :(得分:1)

Feign在Response对象中具有标题,并且可以是返回值:

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

现在您可以对结果调用headers()。当然,这会使您将身体留为绳子,这并不漂亮。让我们尝试更像Feign的东西。


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

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

现在,标头再次被隐藏,但它们仍可用于解码器,这是我要插入的位置:

@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是邪恶的,但我真的还不知道您想使用该标头值做什么。由你决定。现在,您可以将其用于:

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)