zoukankan      html  css  js  c++  java
  • Resttemplate请求失败如何获取返回的json

    参考:https://blog.csdn.net/u011974797/article/details/82424004

    https://www.cnblogs.com/liumz0323/p/10633785.html

    问题描述:后台用Resttemplate请求失败的话只会在后台报错400,不会返回json错误原因
    解决方法:使用HttpClientErrorException异常捕捉

    try {
        // resttemplate call api
    } catch (HttpClientErrorException e) {
        //捕捉HTTP异常
        e.getResponseBodyAsString();
    } catch (Exception e) {
        //捕捉所有异常
        e.printStackTrace();
    }

    描述:使用RestTemplate请求url,由于Token等验证信息参数失效,报出 401 HttpClientErrorException异常。
    并且获取不到body消息体的错误信息。然而postman工具,是可以返回错误信息的。

    原因:RestTemplate 有自己的默认错误处理。在默认的处理里,判断接收到401状态码则抛出
    HttpClientErrorException异常,并执行了response.getBody(),这就导致我们后续获取不到body消息体了。

      全局异常处理

    @ControllerAdvice
    public class ExceptionHandlerController {
        
        @ExceptionHandler(HttpClientErrorException.class)
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        public void HttpClientErrorExceptionHandler(HttpClientErrorException ex, HttpServletResponse res) {
            UtilFunctions.log.error("HttpClientErrorExceptionHandler, msg: {}, exception: {}", ex.toString(), ex);
            UtilFunctions.reportError("HttpClientErrorExceptionHandler: " + ex.toString(), ex, null);
            JSONObject response = new JSONObject();
            response.put("message", ex.getResponseBodyAsString());
            res.setContentType("application/json;charset=utf-8");
            try {
                res.getWriter().append(response.toString());
            } catch (IOException e) {
                UtilFunctions.log.error("IOException, exception: {}", e.getMessage(), e);
            }
        }
    }
    /*
     * 因为Content-Type=application/x-www-form-urlencoded, 所以post请求body中的参数格式也是 a=xxx&b=xxx;
     * params可以为null
     * 
     */
    private static HttpEntity<String> requestEntityRequireAuth(HttpServletRequest request, String params) {
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.add("Authorization", getAuthorization(request));
        requestHeaders.add("accept", "*/*");
        requestHeaders.add("connection", "Keep-Alive");
        requestHeaders.add("Content-Type", "application/x-www-form-urlencoded");
        requestHeaders.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0");
        HttpEntity<String> requestEntity = new HttpEntity<String>(params, requestHeaders);
        return requestEntity;
    }
    
    private static HttpEntity<String> requestEntityNotRequireAuth(HttpServletRequest request, String params) {
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.add("accept", "*/*");
        requestHeaders.add("connection", "Keep-Alive");
        requestHeaders.add("Content-Type", "application/x-www-form-urlencoded");
        requestHeaders.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0");
        HttpEntity<String> requestEntity = new HttpEntity<String>(params, requestHeaders);
        return requestEntity;
    }
    
    private static JSONObject returnResult(ResponseEntity<Object> result, HttpServletResponse response) {
        int status = result.getStatusCodeValue();
        JSONObject obj = new JSONObject();
        if (status == 200) {
            obj.put("data", result.getBody());
        } else {
            response.setStatus(status);
            obj.put("message", result.getBody());
        }
        
        return obj;
    }
    
    private static JSONObject exceptionReturnResult(HttpClientErrorException e, HttpServletResponse response) {
        int statusCode = e.getStatusCode().value();
        JSONObject obj = new JSONObject();
        response.setStatus(statusCode);
        obj.put("message", e.getResponseBodyAsString());
        return obj;
    }
    
    /**
     * GET请求,需要认证,返回结果中data为JSONObject
     */
    public static Object getForObjectRequireAuth(HttpServletRequest request, HttpServletResponse response, String uri) throws Exception {
        // 通过ContextProvider从spring容器获取RestTemplate实例
        RestTemplate restTemplate = ContextProvider.getBean(RestTemplate.class);
        ResponseEntity<Object> result = null;
        try {
            result = restTemplate.exchange(Config.BASE_SITE + uri, HttpMethod.GET, requestEntityRequireAuth(request, null), Object.class);
        } catch (HttpClientErrorException  e) {
            return exceptionReturnResult(e, response);
        }
        return returnResult(result, response);
    }
  • 相关阅读:
    使用FormatterServices 类序列化或反序列化
    HaozesFx(飞信精灵)发布
    EF Provider for Access/ODBC 以及ADO.Net Entity Framework 与Linq to SQL的比较和适用场景:
    Fetion2008 分析 Part3:会话
    Gleaner(个人文档管理)
    This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.
    发一个收取Pop3邮件的代码
    码农架构技术周刊 | 第1期
    这样学Redis,才能技高一筹!
    CommunityServer2.1删除anonymous帐号后的解决办法
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/11474181.html
Copyright © 2011-2022 走看看