引言:在我们开发的过程中,常常会听到或者接触到第三方接口,那么这个第三方接口到底是什么呢?
简单来说就是一个远程接口,不是在你本机上的,你需要通过远程url去访问调用该接口。许多项目中有明确的要求需要调用第三方接口,因为两边处理的业务可能不太一样,但是要求做到数据能够同步。打个比方,你在本地删除了一些数据,但是第三方数据库中却还存在该数据,这时候那就需要调用第三方的接口来进行一个数据删除,到达数据同步的目的。项目中有明确要求需要调用第三方接口的,一般都会有规范的接口调用文档,调用第三方接口时,你只需要根据该接口文档来封装传输参数的格式,并接收相应的返回参数,下面是一个实际项目中调用第三方接口的示例:
一。接口规范文档示例
1.请求参数规范如下:
2.返回参数规范如下:
二。调用第三方接口工具类
工具类代码如下:
package cn.stylefeng.guns.core.util;
import cn.stylefeng.guns.core.common.exception.BizExceptionEnum;
import cn.stylefeng.roses.kernel.model.exception.ServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
/**
* 调用第三方接口工具类
*/
public class HttpUtil {
private static Logger logger = LoggerFactory.getLogger(HttpUtil.class);
public HttpUtil() {
}
/**
* 提交json数据格式的post请求
* @param url
* @param requstBody
* @return
* @throws Exception
*/
public static String doPost(String url, String requstBody) throws Exception {
return doPost(url, requstBody, "application/json; charset=UTF-8", "POST", "UTF-8");
}
/**
* 处理post请求
* @param url
* @param requstBody
* @param contentType
* @param requestMethod
* @param charset
* @return
* @throws Exception
*/
public static String doPost(String url, String requstBody, String contentType, String requestMethod, String charset) throws Exception {
StringBuffer buffer = new StringBuffer();
InputStream inputStream = null;
OutputStream outputStream = null;
BufferedReader reader = null;
OutputStreamWriter writer = null;
URL urlObject = null;
HttpURLConnection connection = null;
try {
urlObject = new URL(url);
connection = (HttpURLConnection)urlObject.openConnection();
connection.setRequestMethod(requestMethod);//设置请求方式为POST
connection.setRequestProperty("Accept", contentType);
connection.setRequestProperty("Charset", charset);//设置字符编码
connection.setRequestProperty("Content-type", contentType);//设置参数类型
connection.setDoInput(true);//允许写出
connection.setDoOutput(true);//允许读入
connection.setConnectTimeout(300000);//连接主机的超时时间(单位:毫秒)
connection.setReadTimeout(300000);//从主机读取数据的超时时间(单位:毫秒)
connection.setAllowUserInteraction(true);//为true,则在允许用户交互(例如弹出一个验证对话框)的上下文中对此URL进行检查
connection.connect();//建立连接
outputStream = connection.getOutputStream();
writer = new OutputStreamWriter(outputStream, charset);
writer.write(requstBody);
writer.flush();
writer.close();
checkResponseCode(connection.getResponseCode());
inputStream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream, charset));
String line = null;
while((line = reader.readLine()) != null) {
buffer.append(line);
}
} catch (Exception var16) {
throw var16;
} finally {
if (reader != null) {
reader.close();
}
if (writer != null) {
writer.close();
}
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
if (connection != null) {
connection.disconnect();
}
}
return buffer.toString();
}
/**
* 提交带参数的get请求
* @param url
* @param charset
* @return
* @throws Exception
*/
public static String doGet(String url, String charset) throws Exception {
return doGet(url, "application/json; charset=" + charset, charset);
}
/**
* 处理get请求
* @param url
* @param contentType
* @param charset
* @return
* @throws Exception
*/
public static String doGet(String url, String contentType, String charset) throws Exception {
BufferedReader in = null;
HttpURLConnection conn = null;
try {
url = dealUrlParameter(url, charset);
URL realUrl = new URL(url);
conn = (HttpURLConnection)realUrl.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("Charset", charset);
conn.setRequestProperty("Accept-Charset", charset);
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Content-Type", contentType);
conn.setConnectTimeout(300000);
conn.setReadTimeout(300000);
conn.setUseCaches(false);
checkResponseCode(conn.getResponseCode());
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), charset));
StringBuilder builderLine = new StringBuilder();
String line;
while((line = in.readLine()) != null) {
builderLine.append(line);
}
logger.debug(builderLine.toString());
String var8 = builderLine.toString();
return var8;
} catch (Exception var17) {
logger.error(var17.toString());
throw var17;
} finally {
try {
if (conn != null) {
conn.disconnect();
}
if (in != null) {
in.close();
}
} catch (IOException var16) {
var16.printStackTrace();
}
}
}
/**
* 处理get请求传递的参数
* @param url
* @param charset
* @return
* @throws IOException
*/
public static String dealUrlParameter(String url, String charset) throws IOException {
int parameterIndex = url.indexOf("?");
if (parameterIndex==-1) {
return url;
} else {
String parameter = url.substring(parameterIndex + 1);
String[] parameterArray = parameter.split("&");
StringBuffer newParameter = new StringBuffer();
String[] var6 = parameterArray;
int var7 = parameterArray.length;
for(int var8 = 0; var8 < var7; ++var8) {
String kv = var6[var8];
String[] keyValue = kv.split("=");
String vlaue = keyValue.length == 2 && keyValue[1] != null ? URLEncoder.encode(keyValue[1], charset) : "";
if (newParameter.length() == 0) {
newParameter.append(keyValue[0]).append("=").append(vlaue);
} else {
newParameter.append("&").append(keyValue[0]).append("=").append(vlaue);
}
}
return url.substring(0, parameterIndex) + "?" + newParameter;
}
}
/**
* 检验是否交互成功
* @param responseCode
*/
public static void checkResponseCode(int responseCode) {
if (responseCode < 400) {
logger.info("请求交互成功");
} else if (responseCode < 500) {
if (responseCode == 429) {
throw new ServiceException(BizExceptionEnum.REQUEST_NULL);
} else {
throw new ServiceException(BizExceptionEnum.REQUEST_NULL);
}
} else {
throw new ServiceException(BizExceptionEnum.SERVER_ERROR);
}
}
}
三。在本地service层写好调用接口
/**
* @Author ${USER}
* @Description 添加人脸推送
* @Date 16:21 2020/4/10
* @Param
* @return
**/
String pushAddFace(List<Map<Object,Object>> list);
四。接口实现
这里调用第三方接口:
@Override
public String pushAddFace(List<Map<Object,Object>> list) {
String message="";
try{
String url="这里输入你需要调用的第三方接口url";
String json= JSON.toJSONString(list);
message=HttpUtil.doPost(url,json);
}catch(Exception e){
e.printStackTrace();
}
return message;
}
五。控制器业务调用
//调用第三方接口
List<Map<Object,Object>> list=new ArrayList<>();
Map<Object,Object> map=new HashMap<>();
//接口参数
map.put("person_id",faceId);
map.put("person_name",faceRecognition.getUserName());
map.put("face_picture",fileData);
list.add(map);
//调用接口后返回参数
String message=faceRecognitionService.pushAddFace(list);
//转化为json数据
JSONObject ject=JSONObject.parseObject(message);
if(ject.get("success").equals("false")){
throw new ServiceException(BizExceptionEnum.REQUEST_NULL);
}
总结:其实调用第三方接口也与我们调用自己写好的接口一样,在service层写好自己的接口,然后写接口的实现,只不过接口的实现换成了调用第三方接口,最后在控制器中写业务逻辑,并调用该接口。