当前位置: 首页 > 知识库问答 >
问题:

处理WebClient中有正文和无正文的错误

季森
2023-03-14

我已经在如下所示的过滤器中实现了错误处理:

public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
  URI url = request.url();
  HttpMethod method = request.method();
  return next.exchange(request).flatMap(response -> {
    if (response.statusCode().isError()) {
      return response.bodyToMono(String.class).flatMap(responseBody -> {
        Optional<Exception> exception = errorResponseHandler.handleError(method, response.statusCode(), url, responseBody);
        if (exception.isPresent()) {
          return Mono.error(exception.get());
        } else {
          // fallback
          return Mono.error(new UnsupportedOperationException("The fallback functionality is still missing"));
        }
      });
    } else {
      return Mono.just(response);
    }
  });
}

如果响应带有一个主体,那么< code > response . bodytomono(string . class ),这样做应该没问题。平面地图(...)被执行。然而当身体是空的时候,什么都不会发生,但是我想要的是也处理错误。我的理解是,我会这样做:

response.bodyToMono(String.class).flatMap(...)
.switchIfEmpty(Mono.error(new UnsupportedOperationException("The body was empty")));

这不起作用,因为预期返回的类型是Mono而不是Mono。

我如何在有响应体和无响应体的情况下实现对错误的处理,这是纠正异常所需的构造?

共有1个答案

谭彦
2023-03-14

这个问题让我走上了正确的轨道:switchIfEmpty 调用必须在 flatMap 之前出现。由于没有主体,flatMap 不会执行,之后的任何内容也不会执行,因此 switchIfEmpty 必须排在第一位:

public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
  URI url = request.url();
  HttpMethod method = request.method();
  return next.exchange(request).flatMap(response -> {
    if (response.statusCode().isError()) {
      return response.bodyToMono(String.class)
        .switchIfEmpty(Mono.error(new UnsupportedOperationException("The body was empty")));
        .flatMap(responseBody -> {
          Optional<Exception> exception = errorResponseHandler.handleError(method, response.statusCode(), url, responseBody);
          if (exception.isPresent()) {
            return Mono.error(exception.get());
          } else {
            // fallback
            return Mono.error(new UnsupportedOperationException("The fallback functionality is still missing"));
          }
        });
    } else {
      return Mono.just(response);
    }
  });
}
 类似资料:
  • 使用WebClient的exchangeToMono()时,正文检索部分总是返回一个空的Mono: 例如,返回非空Mono的公开服务 带有 带有的WebClient 我做错什么了吗?

  • 我试图发送一个包含正文数据的POST请求,如下所述:https://scrapyrt.readthedocs.io/en/stable/api.html#POST。 以下是我尝试做的,但它给了我HTTP代码500

  • 在控制台中,我跟踪我所在站点正在拨打的电话,我可以看到地址(some.site.com/gettoken)、消息头和FF称之为消息体的东西。正是在后者中,我可以看到我在正在发送的站点上输入的凭据。 所以,我有URL和消息正文。然后,我尝试像这样使用C#为我的Azure服务层实现行为。 然而,我得到错误400-糟糕的结果。我错过了什么? 我在google上搜索了一些东西,但唯一与之相关的是我使用的上

  • 因此,我试图使用wiremck向带有请求正文的URL发出后请求,然后使用我的respons.json文件返回响应。(自定义响应) 我就是这样设置的,但我似乎找不到任何关于如何设置带有请求主体的post存根(包含数据,比如说尝试创建ID),然后检索自定义响应主体(从json文件创建ID响应)的信息。我该怎么设置呢。我尝试通过json文件请求生成id,然后尝试检索创建的id。 WithBodyFile

  • 我想在以下条件下抛出自定义异常: > 如果我得到了json格式的正确错误响应,我想反序列化它,并在onStatus()中抛出名为CommonException的异常 如果作为响应的一部分接收HTML内容或反序列化未成功执行,则我希望抛出GenericeException,这是我在onErrorMap()中创建的 在抛出GenericException时,我希望将从下游响应获得的相同HttpStat

  • 我正在尝试使用camel-stax制作一条处理大xml文件的路由。文件内容处理工作正常,但最终失败并出现以下错误: camel似乎不会关闭文件输入流,因此在处理之后,它无法将文件移动到目标位置。当然,我可以将noop设置为true,这是我想要删除已处理文件的位。 我的路线如下所示: 起初它有点复杂,我尽可能简化了它。现在它看起来就像这里的最后一个样本http://camel.apache.org/