最近学习使用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...,江湖救急,跪谢大神!!
添加回答
举报
0/150
提交
取消