前言
工作当中,经常会使用到很多第三方提供的功能或者我们自己家也会提供一些功能给别人使用。
一般都是通过相互调用API接口的形式,来进行业务功能的对接。
这里所讲的API接口,一般是指HTTP(s)形式的请求,遵循RESTful的标准。
传统情况下,在Java代码里面访问restful服务,一般使用Apache的HttpClient,不过此种方法使用起来非常繁琐。
Spring从3.0开始提供了一种非常简单的模板类来进行操作,这就是RestTemplate。
Spring Boot如何使用RestTemplate
1、在项目pom.xml文件中引入web,依赖内容如下:
org.springframework.boot spring-boot-starter-web
一般项目中都会已有此依赖。
2、封装RestTemplate配置类RestTemplateConfig(一般放在api/conf目录),代码如下:
package com.***.api.conf; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean public ClientHttpRequestFactory httpRequestFactory() { return new HttpComponentsClientHttpRequestFactory(httpClient()); } @Bean public RestTemplate restTemplate() { return new RestTemplate(httpRequestFactory()); } @Bean public HttpClient httpClient() { Registryregistry = RegistryBuilder. create() .register("http", PlainConnectionSocketFactory.getSocketFactory()) .register("https", SSLConnectionSocketFactory.getSocketFactory()) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); connectionManager.setMaxTotal(3000); connectionManager.setDefaultMaxPerRoute(1000); RequestConfig requestConfig = RequestConfig.custom() .setSocketTimeout(3000) .setConnectTimeout(3000) .setConnectionRequestTimeout(3000) .build(); return HttpClientBuilder.create() .setDefaultRequestConfig(requestConfig) .setConnectionManager(connectionManager) .build(); } }
3、使用举例
举例调用第三方的一个API接口(POST),根据手机号码获取用户的个人信息。
@Override public UserInfo isUserHasCalendar(RestTemplate restTemplate, String sMobile) { JSONObject postData = new JSONObject(); postData.put("mobile", sMobile); // URL为第三方HTTP接口地址 String URL = “******”; return restTemplate.postForEntity(URL, postData, UserInfo.class).getBody(); }
再拿对接过的小鹅通API接口,举例。
小鹅通开放API接口文档:
文档地址: https://api-doc.xiaoe-tech.com/
1)调用“获取access_token”接口:
此接口的官方文档:
请求方式为get,关键代码如下:
public String getXiaoETongToken(RestTemplate restTemplate) { String url = "https://api.xiaoe-tech.com/token?app_id=app******&client_id=xop******&secret_key=******&grant_type=client_******"; ResponseEntityresults = restTemplate.exchange(url, HttpMethod.GET, null, JSONObject.class); Token tokenDto = JSONObject.toJavaObject(results.getBody(), Token.class); return tokenDto.getData().getAccess_token(); }
2)调用“查询单个用户信息”接口
此接口的官方文档:
请求方式为post,通过user_id获取用户信息的关键代码如下:
public XiaoETongUser getXiaoETongUser(RestTemplate restTemplate, String Token, String userId) { XiaoETongUser user = null; try { String url = "https://api.xiaoe-tech.com/xe.user.info.get/1.0.0"; JSONObject postData = new JSONObject(); postData.put("access_token", Token); postData.put("user_id", userId); Map map = new HashMap(); String[] list = {"name", "nickname", "wx_union_id", "wx_open_id", "wx_app_open_id", "wx_avatar"}; map.put("field_list", list); postData.put("data", map); ResultMap resultMap = restTemplate.postForEntity(url, postData, ResultMap.class).getBody(); if (resultMap.get("code").equals(0)) { String data = JSON.toJSONString(resultMap.get("data")); user = JSONObject.parseObject(data, XiaoETongUser.class); } } catch (RestClientException e) { e.printStackTrace(); } return user; }
总结
上面,我只演示了最常使用的请求方式get、post的简单使用方法,当然RestTemplate的功能还有很多,比如:请求方式为delete、put等等,我就不一一举例了,感兴趣的可以去看看RestTemplate的源码。
到此这篇关于Springboot使用RestTemplate调用第三方接口的文章就介绍到这了,更多相关RestTemplate调用第三方接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!