为了账号安全,请及时绑定邮箱和手机立即绑定

请教一个Restemplate远程调用腾讯云API的问题

请教一个Restemplate远程调用腾讯云API的问题

慕仙森 2019-01-18 20:30:46
最近学习使用Spring的Restemplate进行远程调用接口,腾讯那边的API文档要求的是json格式,需要设置请求头有三个字段:Host,Content-Type,Authorization(具体可看API文档:https://cloud.tencent.com/doc...,请求参数数据可用,编码如下 public R checkPhoto(Map<String,Object> param){ // 通过param可以拿到需要的参数 ...... String authtion = null; try { // 签名有效时长为 3600 秒 authtion = SignUtil.appSign(appid,g.getSecretId(),g.getSecretKey(),Constant.TX_COS_BUCKET_AUTHINFO,3600); } catch (Exception e) { e.printStackTrace(); log.error("签名生成失败"); return R.error("签名生成失败"); } // 设置请求头 HttpHeaders requestHeader = new HttpHeaders(); requestHeader.setContentType(MediaType.APPLICATION_JSON); requestHeader.add("Host","recognition.image.myqcloud.com"); requestHeader.add("Authorization",authtion); // 设置请求体参数 Map<String,Object> paramMap = new HashedMap(); paramMap.put("appid",appid); paramMap.put("urlA",urlA); paramMap.put("urlB",urlB); // 转换参数为 JSON 对象并调用postForObject发起post请求 String str = JSON.toJSONString(paramMap); JSONObject json = JSON.parseObject(str); HttpEntity<JSONObject> request = new HttpEntity<JSONObject>(json,requestHeader); String response = this.restTemplate.postForObject(Constant.TX_FACE_URL_HTTP,request,String.class); ....... } 这里贴出Service的部分代码,请教各位大神为什么使用JSONObject的请求参数会报错400,而下面我使用POJO的方式,将请求参数封装起来可以得到成功调用 public R checkPhoto(Map<String,Object> param){ // 通过param可以拿到需要的参数 ...... String authtion = null; try { // 签名有效时长为 3600 秒 authtion = SignUtil.appSign(appid,g.getSecretId(),g.getSecretKey(),Constant.TX_COS_BUCKET_AUTHINFO,3600); } catch (Exception e) { e.printStackTrace(); log.error("签名生成失败"); return R.error("签名生成失败"); } // 设置请求头 HttpHeaders requestHeader = new HttpHeaders(); requestHeader.setContentType(MediaType.APPLICATION_JSON); requestHeader.add("Host","recognition.image.myqcloud.com"); requestHeader.add("Authorization",authtion); // *******************区别上一份代码**************************// // 设置请求体参数 TxAPIDto dto = TxAPIDto.builder().appid(g.getAppId()).urlA(urlA).urlB(urlB).build(); HttpEntity<TxAPIDto> request = new HttpEntity(dto,requestHeader); ResponseEntity<TxAPIDto> apiresponse = this.restTemplate.exchange(Constant.TX_FACE_URL_HTTP, HttpMethod.POST,request,TxAPIDto.class); TxAPIDto respnose = apiresponse.getBody(); ....... } 使用DTO的方式可以成功调用,但是使用这种方式继续调用腾讯OCR识别接口(相比上一个接口参数和返回内容复杂了些,API:https://cloud.tencent.com/doc...,江湖救急,跪谢大神!!
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

最后发现是腾讯接口的尿性,参数值是动态的图片链接,换成最新的就好了!

查看完整回答
反对 回复 2019-02-12
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

有DTO为啥要用JsonObject…

查看完整回答
反对 回复 2019-02-12
  • 3 回答
  • 0 关注
  • 809 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信