标签: web-client

WebClient与RestTemplate

按照春季5:

WebClient是表示执行Web请求的主要入口点的接口.

它已作为Spring Web Reactive模块的一部分创建,并将在这些场景中替换经典的RestTemplate.新客户端是一种通过HTTP/1.1协议工作的反应式非阻塞解决方案

这是否意味着,如果我们想要升级到Spring 5,我们需要使用RestTemplate重新编码旧应用程序?

或者在Spring 5中使用RestTemplate有一些解决方法?

spring reactive-programming web-client resttemplate

31
推荐指数
5
解决办法
2万
查看次数

在Spring Boot中使用Web Client Mono获取API响应错误消息

我正在使用webflux Mono(在Spring Boot 5中)使用外部API。当API响应状态代码为200时,我能够很好地获取数据,但是当API返回错误时,我无法从API检索错误消息。Spring WebClient错误处理程序始终将消息显示为

ClientResponse has erroneous status code: 500 Internal Server Error,但是当我使用PostMan时,API返回此JSON响应,其状态码为500。

{
 "error": {
    "statusCode": 500,
    "name": "Error",
    "message":"Failed to add object with ID:900 as the object exists",
    "stack":"some long message"
   }
}
Run Code Online (Sandbox Code Playgroud)

我使用WebClient的请求如下

webClient.getWebClient()
            .post()
            .uri("/api/Card")
            .body(BodyInserters.fromObject(cardObject))
            .retrieve()
            .bodyToMono(String.class)
            .doOnSuccess( args -> {
                System.out.println(args.toString());
            })
            .doOnError( e ->{
                e.printStackTrace();
                System.out.println("Some Error Happend :"+e);
            });
Run Code Online (Sandbox Code Playgroud)

我的问题是,当API返回状态代码为500的错误时,如何访问JSON响应?

spring web-client spring-boot spring-webflux

10
推荐指数
3
解决办法
1万
查看次数

调用在URL中具有查询参数的"REST"服务

我必须在返回的服务上调用GET text/xml.

端点是这样的:

http://service.com/rest.asp?param1=34&param2=88&param3=foo
Run Code Online (Sandbox Code Playgroud)

当我直接在浏览器(或一些UI工具)上点击这个URL时,一切都很好.我收到回复.

现在,我试图使用CXF WebClient一段代码来获取结果,如下所示:

String path = "rest.asp?param1=34&param2=88&param3=foo";

webClient.path(path)
    .type(MediaType.APPLICATION_JSON)
    .accept(MediaType.TEXT_XML_TYPE)
    .get(Response.class);
Run Code Online (Sandbox Code Playgroud)

我正在调试代码,发现发送的请求是url编码的,看起来像这样:

http://service.com/rest.asp%3Fparam1=34%26param2=88%26param3=foo
Run Code Online (Sandbox Code Playgroud)

现在,问题是服务器似乎不理解带有编码内容的这个请求.它会抛出404.在浏览器上点击此编码的URL也会产生404.

我该怎么做才能成功获得响应(或者不让WebClient对url进行编码)?

java rest web-services cxf web-client

7
推荐指数
1
解决办法
2万
查看次数

无阻塞地将 Mono 转换为 Pojo

有没有办法将 Mono 对象转换为 java Pojo?我有一个 Web 客户端连接到 3rd 方 REST 服务,Mono我必须提取该对象并询问它,而不是返回。

我找到的所有示例都返回了,Mono<Pojo>但我必须获得 Pojo 本身。目前,我通过调用block()Pojo 来做到这一点,但有没有更好的方法来避免阻塞?

该块的问题在于,在几次运行后,它开始抛出一些错误,例如块因错误而终止。

 public MyPojo getPojo(){
     return myWebClient.get()
                .uri(generateUrl())
                .headers(createHttpHeaders(headersMap))
                .exchange()
                .flatMap(evaluateResponseStatus())
                .block();
}


private Function<ClientResponse, Mono<? extends MyPojo>> evaluateResponseStatus() {
      return response -> {
            if (response.statusCode() == HttpStatus.OK) {
                return response.bodyToMono(MyPojo.class);
            }
            if (webClientUtils.isError(response.statusCode())) {
                throw myHttpException(response);
                // This invokes my exceptionAdvice
                // but after few runs its ignored and 500 error is returned.
            }
            return Mono.empty();
        };
    }
Run Code Online (Sandbox Code Playgroud)

java web-client project-reactor spring-webflux

2
推荐指数
1
解决办法
1万
查看次数