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

标签 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

最佳答案

我跟踪了 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 错误请求。您也可以从 Javadoc 中看到这一点。您或许可以将服务器配置为发回状态代码文本消息,但这样做仍然无法帮助您使用 getStatusText() 方法获取自定义错误消息。

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

关于java - HttpClientErrorException.getStatusText 和 HttpClientErrorException.getResponseBodyAsString 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54333826/

相关文章:

java - tea servlet框架有什么用?

Java简单代码: java.net.SocketException:来自服务器的文件意外结束

java - 在线程上调用方法 - 它可以工作,但为什么呢?

java - 项目初始化后如何查找Spring依赖?

tomcat - 通过 Tomcat 进行 Spring Boot LDAP 身份验证(预身份验证)

http - Grails - SSL 和 Spring 安全核心

java - maven-shade-plugin 不会替换原来的 jar

java - com.fasterxml.jackson.databind.exc.InvalidDefinitionException : No serializer found

http - REST 架构风格是否需要在物理上分离客户端和服务器?

angular - 使用 httpClient 的 post 方法在 url 中传递参数