RestTemplate状态码为401时,获取不到body信息

本文探讨了在调用第三方API时如何处理非200状态码响应,特别是针对HTTP客户端和服务端错误的异常处理策略。文章深入分析了在使用Spring框架的RestTemplate时,如何通过自定义DefaultResponseErrorHandler来捕获并处理HttpClientErrorException,同时提供了修改RequestFactory以解决401状态码下响应消息获取问题的方法。
调用第三方api 若是服务返回状态码不为200,默认会执行DefaultResponseErrorHandler
异常处理

@Override
	public void handleError(ClientHttpResponse response) throws IOException {
		HttpStatus statusCode = getHttpStatusCode(response);
		switch (statusCode.series()) {
			case CLIENT_ERROR:
				throw new HttpClientErrorException(statusCode, response.getStatusText(),
						response.getHeaders(), getResponseBody(response), getCharset(response));
			case SERVER_ERROR:
				throw new HttpServerErrorException(statusCode, response.getStatusText(),
						response.getHeaders(), getResponseBody(response), getCharset(response));
			default:
				throw new RestClientException("Unknown status code [" + statusCode + "]");
		}
	}


	判断是否异常
	protected boolean hasError(HttpStatus statusCode) {
		return (statusCode.series() == HttpStatus.Series.CLIENT_ERROR ||
				statusCode.series() == HttpStatus.Series.SERVER_ERROR);
	}

当响应http状态码为401时,使用e.getResponseBodyAsString()无法获取响应消息

	try{
      ......
    }catch (HttpClientErrorException e) {
                String resBody = e.getResponseBodyAsString();
                log.info("客户端异常返回:{}", resBody);
                return new ResponseEntity<>(JSON.parseObject(resBody, res), e.getStatusCode());
            } 

这与初始化RestTemplate设置的RequestFactory有关,默认RequestFactory是SimpleClientHttpRequestFactory,修改为HttpComponentsClientHttpRequestFactory,就可以了

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
        return  restTemplate;
    }

 

资源下载链接为: https://pan.quark.cn/s/9648a1f24758 在 Web 开发过程中,遇到 HTTP 请求 405 错误(Method not allowed)是比较常见的问题。本文通过具体的示例代码,深入探讨了该错误的解决方法,具有很强的实用性和参考价值,值得大家学习借鉴。 当客户端向服务器发送请求,如果请求的方法(如 GET、POST、PUT、DELETE 等)不被服务器支持,就会出现 405 错误。例如,服务器只允许对某个资源使用 GET 方法进行访问,而客户端却发送了 POST 请求,就会触发此错误。 以常见的 Web 框架 Flask 为例,如果出现 405 错误,需要检查路由装饰器中是否正确指定了支持的方法。例如: 如果客户端发送 POST 请求访问该路由,就会出现 405 错误。此,可以根据实际需求修改代码,允许更多的请求方法: 客户端也需要确保发送的请求方法与服务器端支持的方法一致。例如,在使用 JavaScript 发送请求: 如果服务器端不支持 POST 方法,就需要将请求方法改为 GET 或其他被允许的方法。 HTTP 请求 405 错误通常是由于客户端和服务器端请求方法不匹配导致的。通过检查服务器端代码,确保路由装饰器中正确指定了支持的方法;同,检查客户端请求,确保发送的请求方法与服务器端支持的方法一致,就可以有效解决该问题。希望本文的示例代码和解决方法能对大家的学习和工作有所帮助。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值