我使用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状态代码的文本填充,而不是您的自定义错误消息。例如,服务器可能返回back error400 Bad Request,而不是返回返回的错误代码400。服务器可能返回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和其他东西中),那么可以使用regex过滤掉响应消息中不有用的部分。

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

10-09 02:57