按照春季5:
WebClient是表示执行Web请求的主要入口点的接口.
它已作为Spring Web Reactive模块的一部分创建,并将在这些场景中替换经典的RestTemplate.新客户端是一种通过HTTP/1.1协议工作的反应式非阻塞解决方案
这是否意味着,如果我们想要升级到Spring 5,我们需要使用RestTemplate重新编码旧应用程序?
或者在Spring 5中使用RestTemplate有一些解决方法?
我正在使用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响应?
我必须在返回的服务上调用GET text/xml.
端点是这样的:
http://service.com/rest.asp?param1=34¶m2=88¶m3=foo
Run Code Online (Sandbox Code Playgroud)
当我直接在浏览器(或一些UI工具)上点击这个URL时,一切都很好.我收到回复.
现在,我试图使用CXF WebClient一段代码来获取结果,如下所示:
String path = "rest.asp?param1=34¶m2=88¶m3=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进行编码)?
有没有办法将 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)