HttpClientErrorException.getStatusText和HttpClientErrorException.getResponseBodyAsString之间的区别

时间:2019-01-23 18:49:42

标签: java spring-boot http resttemplate

我使用httpResp.sendError(400, "You are missing customer 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;
        }
    }

Sprint引导版本:2.1.0.RELEASE

1 个答案:

答案 0 :(得分:0)

我跟踪了RestTemplate实际如何进行呼叫的代码。基本上,发生的情况是HttpClientErrorException.getStatusText()的结果是由HTTP状态代码的文本填充的,而不是您的自定义错误消息。例如,服务器可能不仅返回错误代码400,还可能返回错误400 Bad Request。服务器可能会返回200 OK来代替状态码200。如果服务器以该可选文本作为响应,则调用getStatusText()时将看到此内容。请注意,您无法在服务器端自定义OKBad Request之类的文本。

之所以发生这种情况,是因为在内部,Spring在内部使用SimpleClientHttpResponse.getStatusText()来使用HttpUrlConnection.getResponseMessage()。从getResponseMessage的Javadoc中可以看到,返回的可能值并非自定义错误消息。请注意,在您的情况下,getStatusText()返回null,因为您的服务器只是发回了诸如400之类的状态行,而不是400 Bad Request。您也可以从Javadoc中看到这一点。您可能可以将服务器配置为发送回状态代码文本消息,但是这样做仍然无法帮助您使用getStatusText()方法来获取自定义错误消息。

因此,HttpClientErrorException.getStatusText()并不是您所需要的。相反,您需要继续调用getResponseBodyAsString()。但是,如果您知道从服务器发送回的响应主体的格式(因为它可能会包装在HTML和其他内容中),则可以使用正则表达式来过滤掉响应消息中无用的部分。 / p>