gpt4 book ai didi

java - 在Spring中使用ClientHttpRequestInterceptor时如何中止请求?

转载 作者:行者123 更新时间:2023-12-02 09:16:32 25 4
gpt4 key购买 nike

如果您阅读 javadocClientHttpRequestInterceptor.intercept 方法上,它说:

execute the request using ClientHttpRequestExecution.execute(org.springframework.http.HttpRequest, byte[]), or do not execute the request to block the execution altogether.

该语句的第二部分是我想要实现的目标(根据某些标准完全阻止执行)。然而,我这样做并没有成功。我已经做了几个小时的研究,但仍然找不到任何关于如何完成此操作的示例。

我尝试返回 null,后来在流程中得到了 NPE,因为 Spring 尝试从响应中获取 statusCode(下面的异常(exception))。

java.lang.NullPointerException: null
at org.springframework.web.client.DefaultResponseErrorHandler.getHttpStatusCode(DefaultResponseErrorHandler.java:56)
at org.springframework.web.client.DefaultResponseErrorHandler.hasError(DefaultResponseErrorHandler.java:50)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:655)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:620)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:588)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:536)

编辑:这是一个简单的拦截器,供我尝试实现的目标引用:

  public class FailSafeInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
try{
return execution.execute(request, body);
}catch(Throwable e){
return null;
}
}
}

可能的解决方案:在解决这个问题之后,我设法使用以下代码(使用 MockResponse)使其工作。但我不确定这是否是文档所指的要使用的方法的方式。如果有更好的方法来做到这一点,我将不胜感激。

  public class FailSafeInterceptor implements ClientHttpRequestInterceptor {

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
try{
return execution.execute(request, body);
}catch(Throwable e){
return new MockClientHttpResponse(new byte[]{}, HttpStatus.OK);
}
}
}

最佳答案

MockClientHttpResponse 来自 spring-test ,在生产代码中包含测试类很尴尬。

如果您想在检测到某些内容后中止发送整个请求,只需抛出 RuntimeException (或使用内置 RestClientException):

    @Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {

if(checkNeedAbortSendingRequst()){
throw new RestClientException("Bla blab bla");
}
return execution.execute(request, body);
}
<小时/>

更新:

如果您想安全失败,您当前的解决方案看起来不错,希望在捕获异常时我会使用非 200 状态代码(可能是 500?)。由于我也无法在 spring-mvc 中找到可以从头开始创建或没有任何外部依赖项的 ClientHttpResponse 实现,因此我会从以下位置复制 MockClientHttpResponse spring-test 到要使用的项目。

关于java - 在Spring中使用ClientHttpRequestInterceptor时如何中止请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58944422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com