java调用第三方接口示例

引言:在我们开发的过程中,常常会听到或者接触到第三方接口,那么这个第三方接口到底是什么呢?
简单来说就是一个远程接口,不是在你本机上的,你需要通过远程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层写好自己的接口,然后写接口的实现,只不过接口的实现换成了调用第三方接口,最后在控制器中写业务逻辑,并调用该接口。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Keson Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值