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

最近学习使用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...,江湖救急,跪谢大神!!

慕仙森
浏览 810回答 3
3回答

湖上湖

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

鸿蒙传说

有DTO为啥要用JsonObject…
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java