使用springboot restTemplate,不能拿到详细的error信息解决办法

方法


我们在使用restTemplate的时候如果catch Exception。其实我们拿不到具体的错误信息,我们需要catch HttpStatusCodeException。
具体使用

try{
            responseEntity = restTemplate.exchange(apiUrl , HttpMethod.POST, entity, String.class);
            if(HttpStatus.OK.equals(responseEntity.getStatusCode())) {
                //do something
                
            }

        } catch (HttpStatusCodeException e){
            //for 4XX,5XX from BRE,this HttpStatusCodeException can obtain error message rather than Exception
            throw new BusinessException("error message [{}]," + e.getResponseBodyAsString());
        } catch (Exception e){
            throw new BusinessException(“error message [{}]," + e.getMessage());
        }

这样就可以打印出具体错误信息了。

### 微信小程序登录流程详解 #### 一、概述 微信小程序的登录机制基于OAuth2.0协议,通过获取用户的临时登录凭证`code`并将其发送到开发者服务器,由服务器向微信官方接口换取`session_key`以及可能存在的用户信息。以下是完整的前后端实现过程。 --- #### 二、前端实现 (UniApp/Vue3 或原生微信小程序) ##### 获取 `code` 在微信小程序中,可以通过调用微信提供的API来获取用户的临时登录凭证`code`: ```javascript wx.login({ success(res) { if (res.code) { console.log('获取到 code:', res.code); // 将 code 发送到后端处理 sendCodeToServer(res.code); // 自定义函数用于发送请求 } else { console.error('登录失败!', res.errMsg); } }, }); ``` 此部分实现了用户身份认证的第一步[^1]。 ##### 用户授权登录 如果需要进一步获取用户头像昵称等敏感数据,则需引导用户完成微信授权操作。以下是一个简单的示例代码片段: ```javascript wx.getUserProfile({ desc: '用于完善会员资料', success(userRes) { const userInfo = userRes.userInfo; console.log(userInfo.nickName, userInfo.avatarUrl); // 可以将用户信息连同 code 一起传递给后端 }, fail(err) { console.error('用户拒绝授权:', err); }, }); ``` 这部分逻辑通常配合后端的身份校验共同作用于更复杂的业务场景中[^2]。 --- #### 三、后端实现 (Spring Boot/Django/其他框架均可适用) ##### 接收前端传来的 `code` 当接收到从前端发过来的`code`之后,在服务端发起一次HTTP GET 请求至微信开放平台指定URL地址交换得到真正的会话密钥(`session_key`)及相关参数: 对于 Java SpringBoot 而言可以这样写入控制器方法里去接收这些来自客户端的数据包体内容并通过RestTemplate工具类来进行网络访问动作从而拿到最终的结果集对象形式返回回来供后续使用。 ```java @RestController @RequestMapping("/auth") public class AuthController { @PostMapping("/login") public ResponseEntity<?> login(@RequestBody Map<String, String> payload){ String js_code = payload.get("js_code"); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); HttpEntity<Void> entity = new HttpEntity<>(headers); URI url = UriComponentsBuilder.fromHttpUrl("https://api.weixin.qq.com/sns/jscode2session") .queryParam("appid", "your_app_id") .queryParam("secret","your_secret_key") .queryParam("js_code",js_code ) .queryParam("grant_type","authorization_code").build().toUri(); ResponseEntity<Map> response =restTemplate.exchange(url , HttpMethod.GET,entity,new ParameterizedTypeReference<>() {}); return ResponseEntity.ok(response.getBody()); } } ``` 上述代码展示了如何利用Spring Framework中的组件完成整个交互链条上的重要环节之一即验证用户的真实性[^3]. 而对于 Python Django 来说则可能是另外一种风格但核心思想不变依旧是要先解析出那个唯一标识符然后再拿它去找寻对应的openid等等附加属性出来. ```python from django.http import JsonResponse import requests def wechat_login(request): data = request.POST.dict() appid = settings.WECHAT_APP_ID secret = settings.WECHAT_SECRET_KEY r =requests.get(f'https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={data["code"]}&grant_type=authorization_code') result=r.json() token_payload={ 'user_id':result['openid'], ... } jwt_token=jwt.encode(token_payload,jwt_secret,'HS256') return JsonResponse({'token':jwt_token}) ``` 这里采用JSON Web Tokens(JWTs)作为安全令牌发放手段以便简化跨域资源共享等问题的同时也增强了系统的整体安全性水平.[^4] --- #### 四、总结说明 综上所述,无论是哪种技术栈的选择都遵循着相似的设计思路那就是始终围绕着那几个固定的要素展开讨论比如说是怎样取得有效的授权许可或者是关于个人信息保护方面的考量因素等等都是不可或缺的部分组成成分而已!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值