如何从 feign Response 中读取 header 值

问题描述 投票:0回答:3

我正在使用 spring boot 来调用 openfeign 客户端,并且从该 feign 的响应中我需要提取一些标头值。我该怎么做。 有人可以帮忙吗? 请帮我看看我们是否可以这样做!

spring-boot header response feign
3个回答
4
投票

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

这样您就可以访问响应bodyheaders

@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;
    }

2
投票

您可以使用

import feign.Response
作为回复,例如:

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

然后你就可以到达http header

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

如果你想在这种情况下获取正文,你必须使用一些 json 字符串操作

response.body()
此页面可能会帮助你


0
投票

大概您想要检索(反序列化的)响应正文以及响应标头。在这种情况下,返回

ResponseEntity
是理想的选择,因为它包含两者。

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;

@FeignClient(name = "HttpStatusClient", url = "https://httpstat.us")
interface HttpStatusClient {
    record HttpStatus(int code, String description){}

    @GetMapping(path = "/200", produces = APPLICATION_JSON_VALUE)
    ResponseEntity<HttpStatus> twoHundred();
}
© www.soinside.com 2019 - 2024. All rights reserved.