【问题标题】:How to read header value from feign Response如何从假响应中读取标头值
【发布时间】:2023-01-14 03:17:51
【问题描述】:

我正在使用 spring boot 调用一个 openfeign 客户端,我需要从那个假装的响应中提取一些标头值。我该怎么做。 任何人都可以帮忙吗? 不管我们能不能做到,请帮帮我!

【问题讨论】:

    标签: spring-boot header response feign


    【解决方案1】:

    您可以使用 import feign.Response 作为回复,例如:

    @PostMapping("/test")
    Response test(@RequestBody TestRequest testRequest);
    

    然后你可以到达http标头

    response.headers().get(HEADER_NAME).toString();
    

    如果你想在这种情况下获取正文,你必须使用response.body()this page进行一些json-string操作可能会帮助你

    【讨论】:

      【解决方案2】:

      是的,你可以这样做。使用 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;
          }
      

      【讨论】:

        猜你喜欢
        • 2011-08-25
        • 2016-09-02
        • 1970-01-01
        • 2017-10-17
        • 2018-05-16
        • 2016-09-06
        • 1970-01-01
        • 2017-01-13
        • 1970-01-01
        相关资源
        最近更新 更多