feign如何获取请求接口的header数据
How does feign obtain header data for the requested interface
我正在请求与 feign 的接口,需要获取该接口的 Headers
值。
我之前用过feign请求的接口headers传递参数,传token给headers:
@RequestMapping(method = RequestMethod.GET, value = "/api/get-store-list")
List<Store> getStoreList(@RequestHeader("Authorization") String Authorization);
但是这个接口把数据量放到了headers的x-total-count
里面,所以还是需要获取x-total-count
的值。
如何获取 x-total-count
.
的值
Feign 在 Response
object 中有 headers,可以是 return 值:
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)
我正在请求与 feign 的接口,需要获取该接口的 Headers
值。
我之前用过feign请求的接口headers传递参数,传token给headers:
@RequestMapping(method = RequestMethod.GET, value = "/api/get-store-list")
List<Store> getStoreList(@RequestHeader("Authorization") String Authorization);
但是这个接口把数据量放到了headers的x-total-count
里面,所以还是需要获取x-total-count
的值。
如何获取 x-total-count
.
Feign 在 Response
object 中有 headers,可以是 return 值:
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)