目录

背景

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;
    }

参数是是其他格式的我还没有研究过.遇到了再百度补充!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐