获取 http 响应代码和所有可用的正文

Posted

技术标签:

【中文标题】获取 http 响应代码和所有可用的正文【英文标题】:Get http response code and all available body 【发布时间】:2019-11-04 05:04:39 【问题描述】:

我想实现 WebFlux 示例客户端,它可以使用 http 参数发出请求并获取响应正文和 http 响应代码。我试过这个:

public ClientResponse execute(NotificationMessage nm)
Mono<String> transactionMono = Mono.just(convertedString);
        return client.post().uri(builder -> builder.build())
                .header(HttpHeaders.USER_AGENT, "agent")
                .body(transactionMono, String.class).exchange().block();
    

    private static String convert(Map<String, String> map) throws UnsupportedEncodingException 
        String result = map.entrySet().stream().map(e -> encode(e.getKey()) + "=" + encode(e.getValue()))
                .collect(Collectors.joining("&"));
        return result;
    

    private static String encode(String s) 
        try 
            return URLEncoder.encode(s, "UTF-8");
         catch (UnsupportedEncodingException e) 
            throw new IllegalStateException(e);
        
    

您能否在.exchange() 之后给我一些建议,如何获取 http 状态代码和所有可用的正文。

【问题讨论】:

【参考方案1】:

从 exchange 返回的 ClientResponse 对象中,您可以使用 response.statusCode() 获取状态并使用 response.bodyToMono() 或 bodyToFlux() 获取实际正文。您应该避免在响应式编程中使用 .block() 并使用 .subscribe() 或 .flatMap() 或其他运算符从 Mono 或 Flux 对象获取数据。 Read more 关于响应式编程和 Project reactor(由 spring webflux 使用)在这里。

例如:

public Mono<Data> execute(NotificationMessage nm)
    return client.post().uri(builder -> builder.build())
                .header(HttpHeaders.USER_AGENT, "agent")
                .body(transactionMono, String.class).exchange()
                .flatMap(response -> 
                        HttpStatus code = response.statusCode();
                        Data data = response.bodyToMono(Data.class);
                        return data;
                );

【讨论】:

以上是关于获取 http 响应代码和所有可用的正文的主要内容,如果未能解决你的问题,请参考以下文章

从 HTTPServletResponse 获取正文和响应代码

我可以使用 tcpdump 获取 HTTP 请求、响应标头和响应正文吗?

在错误情况下从 WebClient 获取响应正文的正确方法是啥?

Python:获取网络请求响应正文

使用 HttpRequestException 获取失败请求的响应正文

如何在 Ktor 中获取 call.response 的 http 正文?