【发布时间】:2023-01-14 03:17:51
【问题描述】:
我正在使用 spring boot 调用一个 openfeign 客户端,我需要从那个假装的响应中提取一些标头值。我该怎么做。 任何人都可以帮忙吗? 不管我们能不能做到,请帮帮我!
【问题讨论】:
标签: spring-boot header response feign
我正在使用 spring boot 调用一个 openfeign 客户端,我需要从那个假装的响应中提取一些标头值。我该怎么做。 任何人都可以帮忙吗? 不管我们能不能做到,请帮帮我!
【问题讨论】:
标签: spring-boot header response feign
您可以使用 import feign.Response 作为回复,例如:
@PostMapping("/test")
Response test(@RequestBody TestRequest testRequest);
然后你可以到达http标头
response.headers().get(HEADER_NAME).toString();
如果你想在这种情况下获取正文,你必须使用response.body()this page进行一些json-string操作可能会帮助你
【讨论】:
是的,你可以这样做。使用 Feign,我们通常使用返回我们类的方法来声明我们的接口,Feign 会自动将来自 JSON 的响应反序列化到我们的 POJO 中。
这是界面(操作):
@FeignClient(name = "library-book-service")
@RequestMapping("books")
public interface BookClient {
@GetMapping
public List<Book> getBooks(
@RequestParam("page") Optional<Integer> pageNum,
@RequestParam("size") Optional<Integer> pageSize,
@RequestParam("reader") Optional<Long> readerId);
}
然后你可以像这样使用 feign 客户端:
@Service
@RequiredArgsConstructor
public class BookService {
private final @NonNull BookClient bookClient;
public List<Book> retrieveBooks(
Optional<Integer> pageNum,
Optional<Integer> pageSize,
Optional<Long> readerId) {
return bookClient.getBooks(pageNum, pageSize, readerId);
}
但是,为了访问响应标头,您需要声明您的方法以返回feign.Response。
import feign.Response;
@FeignClient(name = "library-book-service")
@RequestMapping("books")
public interface BookClient {
@GetMapping
public Response getBooks(
@RequestParam("page") Optional<Integer> pageNum,
@RequestParam("size") Optional<Integer> pageSize,
@RequestParam("reader") Optional<Long> readerId);
}
这样您就可以访问响应身体和标题:
@Service
@RequiredArgsConstructor
public class BookService {
private final @NonNull BookClient bookClient;
private final @NonNull ObjectMapper objectMapper;
public List<Book> retrieveBooks(
Optional<Integer> pageNum,
Optional<Integer> pageSize,
Optional<Long> readerId) {
var response = bookClient.getBooks(pageNum, pageSize, readerId);
if (response == null) {
return Collections.emptyList();
}
// retrieve body
var books = objectMapper.readValue(
new BufferedReader(new InputStreamReader(response.body().asInputStream(), StandardCharsets.UTF_8)),
new TypeReference<List<Book>>(){});
// retrieve headers
Map<String, Collection<String>> headers = response.headers();
// ... do whatever you need with the headers
return books;
}
【讨论】: