获取标题假装netflix

时间:2016-08-03 11:24:09

标签: java web-services spring-cloud-netflix netflix-feign

我正在使用netflix feign来传达微服务。

所以我的微服务A有一个操作'OperationA',由微服务B使用,它通过一个名为X-Total的标题将一个参数传递给B

 MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
 headers.add("X-Total", page.getTotalSize()); 

我的客户端界面如下:

@Headers({
    "Content-Type: " + MediaType.APPLICATION_JSON_UTF8_VALUE
})
@RequestLine("GET Dto/")
List<Dto> search();

static DtoClient connect() {
    return Feign.builder()
        .encoder(new GsonEncoder())
        .decoder(new GsonDecoder())
        .target(ConditionTypeClient.class, Urls.SERVICE_URL.toString());
}

然后我得到了dto列表,但我不知道如何获得标题X-TOTAL参数:

public List<Dto> search() {
    DtoClient client = DtoClient.connect();
    return client.search();
}

如何获取标题参数?

2 个答案:

答案 0 :(得分:3)

自定义解码器

您可以使用自定义解码器:

public class CustomDecoder extends GsonDecoder {

    private Map<String, Collection<String>> headers;

    @Override
    public Object decode(Response response, Type type) throws IOException {
        headers = response.headers();
        return super.decode(response, type);
    }

    public Map<String, Collection<String>> getHeaders() {
        return headers;
    }
}

返回响应

其他解决方案可能是返回Response而不是List<Dto>

@Headers({
    "Content-Type: " + MediaType.APPLICATION_JSON_UTF8_VALUE
})
@RequestLine("GET Dto/")
Response search();

然后反序列化body并获取标题:

Response response = Client.search();
response.headers();
Gson gson = new Gson();
gson.fromJson(response.body().asReader(), Dto.class);

答案 1 :(得分:0)

我参加聚会迟到了,但是我知道将来对某人有帮助

我们可以将response包装为ResponseEntity<SomePojo>,方法是我们可以将 headers 对象作为 body 对象访问,类型为{ {1}}。

SomePojo