目录
背景
Spring的RestTemplate
1.引入依赖
2.RestTemplate配置类
3.RestTemplate实现类
背景
java调第三方接口我百度的有三种方法.
第一种:通过JDK网络类Java.net.HttpURLConnection
第二种:通过Apache common封装好的HttpClient
第三种:通过Spring的RestTemplate
这个三种方法在我的scdn收藏里有,都是可以直接用的.
我今天对第三种方式通过Spring的RestTemplate 这个方法再进行详细的说明下,补充一些细节
下面代码用到的LinkedMultiValueMap是用来传form表单格式的参数的,例如:user=你&age=11
下面代码用到的FileSystemResource是用来传form表单格式中含file文件参数的.
LinkedMultiValueMap和FileSystemResource在我的收藏里都有详细介绍,这里我就不多说了.
Spring的RestTemplate
1.引入依赖
导入springboot的web包
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.RestTemplate配置类
/**
* @author hsq
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(15000);
factory.setReadTimeout(15000);
return factory;
}
}
3.RestTemplate实现类
这个是公用的调接口类.仅适用于form-data表单形式.
/**
* 调用OCR接口,返回识别结果
*/
@Slf4j
@Component
public class ReadByOCRUtil {
@Autowired
private RestTemplate restTemplate;
/**
* 通用调接口方法
*
* @param url 接口url
* @param paramMap 参数
* @param mediaType 接口规定传参格式
* @return 返回的结果
*/
public String doExchange(String url, HashMap<String, Object> paramMap, String mediaType) {
//header参数
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType(mediaType));
//放入body中的表单参数
LinkedMultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
for (String key : paramMap.keySet()) {
Object v = paramMap.get(key);
param.add(key, v);
}
//组装
HttpEntity<LinkedMultiValueMap<String, Object>> request = new HttpEntity<>(param, headers);
//ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
//上面注释的一行是我一开始用的,但是自从项目更新用了nacos后,就会报service注入服务错误,于是我就改成了下面两行代码就不报错了,
//至于什么原因后面再去研究补充
RestTemplate rt = new RestTemplate();
//ResponseEntity<String> responseEntity = rt.postForObject(url, request, ResponseEntity.class);
上面的代码用ResponseEntity类接收老是报错,就改为用object接收了.
Object o = rt.postForObject(url, request, Object.class);
String s = JSONObject.toJSONString(o);
return s;
}
}
如果是POST请求方式,参数是用form-data格式,不含file文件那么用下面的代码
/**
* 印章图片识别
*
* @param base64 图片绝对路径的base64值
* @return 调接口返回的结果
*/
public String doStamp(String base64) {
String url = "第三方接口的url";
String mediaType = "第三方接口要求的Content-Type形式";
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("img", base64);
String s = doExchange(url, paramMap, mediaType);
return s;
}
如果是POST请求方式,参数是用form-data格式,但是参数含file文件,那么用下面的代码
/**
* 表格PDF识别
*
* @param absolutePath PDF文件绝对路径
* @return OCR识别结果
*/
public String doFormPDF(String absolutePath) {
String url = "第三方接口的url";
String mediaType = "第三方接口要求的Content-Type形式";
//把临时文件转换成FileSystemResource
FileSystemResource resource = new FileSystemResource(absolutePath);
HashMap<String, Object> paramMap = new HashMap<>();
paramMap.put("file", resource);// 对应客户端的接收参数名称
String result = doExchange(url, paramMap, mediaType);
return result;
}
参数是是其他格式的我还没有研究过.遇到了再百度补充!