Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpClientErrorException.getStatusText和HttpClientErrorException.getResponseBodyAsString之间的差异_Java_Spring Boot_Http_Resttemplate - Fatal编程技术网

Java HttpClientErrorException.getStatusText和HttpClientErrorException.getResponseBodyAsString之间的差异

Java HttpClientErrorException.getStatusText和HttpClientErrorException.getResponseBodyAsString之间的差异,java,spring-boot,http,resttemplate,Java,Spring Boot,Http,Resttemplate,我使用httpResp.sendError(400,“您缺少客户id”)将响应发回 当我尝试在客户端检索消息时(使用Rest模板调用端点) 但是,打印HttpClientErrorException始终会为我生成以下结果: HttpClientErrorException:400 null 我看到我有HttpClientErrorException。getResponseBody包含有关时间戳、消息等的所有信息。但是HttpClientErrorException。getStatusText始终

我使用
httpResp.sendError(400,“您缺少客户id”)
将响应发回

当我尝试在客户端检索消息时(使用Rest模板调用端点)

但是,打印HttpClientErrorException始终会为我生成以下结果:

HttpClientErrorException:400 null

我看到我有
HttpClientErrorException。getResponseBody
包含有关时间戳、消息等的所有信息。但是
HttpClientErrorException。getStatusText
始终为空

我的问题是:如何在服务器端设计ResponseEntity,以便HTTP客户端在response.getStatusText()中找到服务器端异常消息,而不是null

这是我的密码

        try{
        ResponseEntity<String> responseEntity = restTemplate.exchange(uri, HttpMethod.POST, requestEntity, String.class );
        System.out.println(responseEntity.getBody());
    }
    catch (HttpClientErrorException | HttpServerErrorException e) {
        if (e.getStatusCode().equals(HttpStatus.UNAUTHORIZED) || e.getStatusCode().equals(HttpStatus.FORBIDDEN)) {                System.out.println("Response Body returned:");
            System.out.println(e.getResponseBodyAsString());
            System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
            System.out.println("Status text is:");
            System.out.println(e.getStatusText());

        } else if (e.getStatusCode().equals(HttpStatus.BAD_REQUEST)) {
            System.out.println("Response Body returned:");
            System.out.println(e.getResponseBodyAsString());
            System.out.println("-------------------------------");
            System.out.println("Status text is:");
            System.out.println(e.getStatusText());
        } else {
                throw e;
        }
    }
试试看{
ResponseEntity ResponseEntity=restemplate.exchange(uri,HttpMethod.POST,requestEntity,String.class);
System.out.println(responseEntity.getBody());
}
捕获(HttpClientErrorException | HttpServerErrorException e){
如果(e.getStatusCode().equals(HttpStatus.UNAUTHORIZED)| e.getStatusCode().equals(HttpStatus.FORBIDDEN)){System.out.println(“返回的响应体:”);
System.out.println(例如getResponseBodyAsString());
System.out.println(“%%%;
System.out.println(“状态文本为:”);
System.out.println(例如getStatusText());
}else if(例如getStatusCode().equals(HttpStatus.BAD_请求)){
System.out.println(“返回的响应体:”);
System.out.println(例如getResponseBodyAsString());
System.out.println(“------------------------------------”;
System.out.println(“状态文本为:”);
System.out.println(例如getStatusText());
}否则{
投掷e;
}
}

Sprint启动版本:2.1.0.RELEASE

我跟踪了
restemplate
如何实际进行调用的代码。基本上,所发生的是HttpClientErrorException的结果。getStatusText()由HTTP状态代码的文本填充,而不是由自定义错误消息填充。例如,服务器可能会返回错误
400错误请求,而不是返回错误代码400。服务器可能返回
200 OK
,而不是状态代码200。如果服务器用该可选文本进行响应,则调用
getStatusText()
时将看到该文本。请注意,像
OK
Bad Request
这样的文本不能由您在服务器端自定义

之所以会发生这种情况,是因为Spring在内部利用了内部依赖的资源。从
getResponseMessage
的Javadoc中可以看到,返回的可能值并不意味着是自定义错误消息。请注意,在您的情况下,
getStatusText()
返回
null
,因为您的服务器只是返回一个类似
400
的状态行,而不是
400错误请求
。您也可以从Javadoc中看到这一点。您可能可以将服务器配置为发回状态代码文本消息,但这样做仍然无法帮助您使用
getStatusText()
方法获取自定义错误消息


因此,HttpClientErrorException.getStatusText()
不是您所需要的。相反,您需要继续调用
getResponseBodyAsString()
。但是,如果您知道从服务器发回的响应体的格式(因为这很可能是用HTML和其他东西包装的)您可以使用正则表达式过滤掉响应消息中不有用的部分。

您有实际实例化
HttpClientErrorException
和调用
getResponseBody()
getStatusText()
的示例代码吗?另外,您正在运行哪个版本的Spring Boot?@entpnerd我已经添加了代码谢谢您的简要解释。在我的情况下,它只返回
400
,而不是
400
。那么,我如何在服务器上配置以通过异常按预期发送回