精华内容
下载资源
问答
  • 对接第三方接口案例
    千次阅读
    2020-07-29 10:41:47

    一个List对象列表根据Date逆序排序

    直接采用sort方法,传的comparable对象用lambda表达式代替

    list.sort(((o1, o2) -> {
    			Date date1 = (Date) o1.get("createTime");
    			Date date2 = (Date) o2.get("createTime");
    			return date1.compareTo(date2) > -1 ? -1 : 1;
    		}));
    

    compareTo方法意思是,左边比右边小返回-1,相等返回0,更大返回1。
    date1比date2小(距离当前时间远)返回-1,现在用三目运算反过来返回出去。

    分页取第三方接口判断最后一页技巧

    1、当前取到的条数是否少于每页条数。
    2、如果有总条数,判断pageNo*pageSize是否大于总条数,如果是则为最后一页。

    同步第三方接口数据注意

    1、注意接口访问次数限制,必要时线程取一次休眠一段时间。
    2、如果明确返回接口访问次数超限,则采取相应措施再次调用,比如按要求休眠1分钟等。不要因为超限而终止程序。

    取到数据之后需要注意

    1、务必仔细对response数据判空,必要时按错误码分别判空,谨防NPE异常。
    2、由于大多数接口都有accessToken的失效限制,所以,务必在每次接口返回后单独对token失效的错误码做判断,然后再调用一次刷新token的接口。注意取到最新accessToken之后,先保存数据库,再访问一次业务接口!

    存储到数据库之前

    1、必须验证合法性!
    2、必须考虑历史原因,新数据是否会对已有生产环境运行造成影响。

    更多相关内容
  • java对接第三方接口

    千次阅读 2019-11-19 10:02:58
    1.准备与第三方接口对接的账号 配置到了Apollo上面 @Value("${taofake.appId}") private String appId; @Value("${taofake.url}") private String url; @Value("${taofake.appSecret}") private String app...

    1.准备与第三方接口对接的账号

    配置到了Apollo上面

    在这里插入图片描述

        @Value("${taofake.appId}")
    	private String appId;
    	@Value("${taofake.url}")
    	private String url;
    	@Value("${taofake.appSecret}")
    	private String appSecret;
    

    2.准备用于接受接口返回结果的实体类在这里插入图片描述

    3.准备发HTTP请求的工具类

    在这里插入图片描述
    在这里插入图片描述

    http工具类

    package cn.zhaocha.common.utils;
    
    import java.io.IOException;
    import java.util.Map;
    
    import cn.zhaocha.vo.BaseResponseVo;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.util.StringUtils;
    import lombok.extern.slf4j.Slf4j;
    import okhttp3.*;
    
    @Slf4j
    public class OKHttpUtil {
    
    	private static final Logger logger = LoggerFactory.getLogger(OKHttpUtil.class);
    
    	private static OkHttpClient client = getClient();
    
    	public static OkHttpClient getClient() {
    		if (client == null) {
    			client = genericClient();// 创建OkHttpClient对象
    		}
    		return client;
    	}
    
    	public static OkHttpClient genericClient() {
    		OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
    			@Override
    			public Response intercept(Chain chain) throws IOException {
    				Request request = chain.request().newBuilder()
    						// .addHeader("Content-Type", "text/html; charset=gb2312")
    						// .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
    						// .addHeader("Accept-Encoding", "gzip, deflate")
    						// .addHeader("Connection", "keep-alive")
    						// .addHeader("Accept", "*/*")
    						// .addHeader("User-Agent", "Mozilla/5.0 (Linux; Android 9.0.0; MI 6 Build/OPR1.170623.032; wv) AppleWebKit/537.36 (KHTML, like Gecko)
    						// Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36/Android/globalscanner/4.00")
    						// .addHeader("Accept-Language", "zh-CN,en-US;q=0.9")
    						.addHeader("ApiVersion", "1.0")
    						// .addHeader("X-Requested-With", "com.globalscanner")
    						.build();
    				return chain.proceed(request);
    			}
    		}).build();
    
    		return httpClient;
    	}
    
    	public static String postAsync(String urlStr, Map<String, String> paramMap, Callback callback) {
    		return postAsync(urlStr, paramMap, callback, null);
    	}
    
    	public static String postAsync(String urlStr, Map<String, String> paramMap, Callback callback, Map<String, String> header) {
    		Request.Builder oneBuilder = getOneBuilder(urlStr, paramMap, header);
    		Request request = oneBuilder.build();
    		getClient().newCall(request).enqueue(callback);
    		return null;
    	}
    
    	private static Request.Builder getOneBuilder(String urlStr, Map<String, String> paramMap, Map<String, String> header) {
    		// 创建表单请求体
    		FormBody.Builder formBody = new FormBody.Builder();
    		for (String key : paramMap.keySet()) {
    			formBody.add(key, paramMap.get(key));
    		}
    		// 创建Request 对象。//传递请求体
    		Request.Builder postBuild = new Request.Builder().url(urlStr).post(formBody.build());
    		if (header != null && header.size() > 0) {
    			for (String key : header.keySet()) {
    				postBuild.addHeader(key, header.get(key));
    			}
    		}
    		return postBuild;
    	}
    
    	private static Request.Builder getGetBuilder(String urlStr, Map<String, String> paramMap, Map<String, String> header) {
    		HttpUrl.Builder urlBuilder = HttpUrl.parse(urlStr).newBuilder();
    		if (paramMap != null) {
    			for (String key : paramMap.keySet()) {
    				urlBuilder.setQueryParameter(key, paramMap.get(key));
    			}
    		}
    		Request.Builder requestBuilder = new Request.Builder().url(urlBuilder.build())
    				.headers(header == null ? new Headers.Builder().build() : Headers.of(header)).get();
    		return requestBuilder;
    	}
    
    	/**
    	 * 同步请求
    	 */
    	public static <T> BaseResponseVo<T> post(String urlStr, Map<String, String> paramMap, Class clazz) {
    		return post(urlStr, paramMap, null, clazz);
    	}
    
    	public static <T> BaseResponseVo<T> post(String urlStr, Map<String, String> paramMap, Map<String, String> header, Class clazz) {
    		Request.Builder oneBuilder = getOneBuilder(urlStr, paramMap, header);
    		Request request = oneBuilder.build();
    		try {
    			log.info("请求:OKHttpUtil-post-日志信息请求参数:" + urlStr + " " + paramMap.toString());
    			Response response = client.newCall(request).execute();
    			if (response != null && response.isSuccessful()) {
    				if (response.body() == null) {
    					log.info("响应:OKHttpUtil-post-日志信息响应结果未空:");
    					return BaseResponseVo.err("1", "response.body内容为空", null);
    				}
    				String content = response.body().string();
    				log.info("响应:OKHttpUtil-post-日志信息响应结果:" + content);
    				// String content ="{error_msg: \"成功\",error_code: 0}";
    				// String content = "{error_msg: \"失败\",error_code: 1}";
    
    				if (!StringUtils.isEmpty(content)) {
    					T obj = (T) FastJsonUtil.jsonToBean(content, clazz);
    					return BaseResponseVo.succ("0", "获取成功", obj);
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    			return BaseResponseVo.err(e.toString());
    		}
    		return BaseResponseVo.err("1", "获取失败", null);
    	}
    
    	public static <T> BaseResponseVo<T> get(String urlStr, Map<String, String> paramMap, Map<String, String> header, Class clazz) {
    		Request.Builder oneBuilder = getGetBuilder(urlStr, paramMap, header);
    		Request request = oneBuilder.build();
    		try {
    			log.info("请求:OKHttpUtil-post-日志信息请求参数:" + urlStr + " " + paramMap.toString());
    			Response response = client.newCall(request).execute();
    			if (response != null && response.isSuccessful()) {
    				if (response.body() == null) {
    					log.info("响应:OKHttpUtil-get-日志信息响应结果未空:");
    					return BaseResponseVo.err("1", "response.body内容为空", null);
    				}
    				String content = response.body().string();
    				log.info("响应:OKHttpUtil-get-日志信息响应结果:" + content);
    				if (!StringUtils.isEmpty(content)) {
    					T obj = (T) FastJsonUtil.jsonToBean(content, clazz);
    					return BaseResponseVo.succ("0", "获取成功", obj);
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    			return BaseResponseVo.err(e.toString());
    		}
    		return BaseResponseVo.err("1", "获取失败", null);
    	}
    }
    
    

    4.调用第三方接口

    黄色线表示访问第三方接口

    在这里插入图片描述

    现在我们可以来测试一下了

    在这里插入图片描述

    与第三方接口对接就完成了
    展开全文
  • 简单对接第三方接口TestDemo对接快递鸟物流 对接快递鸟物流 1.首先进入网址 http://www.kdniao.com/v2/IndexNew.aspx注册一个快递鸟账号,目前仅仅只是测试,我们注册的时候选择个人,企业随便填写就行了 注册完,...

    对接快递鸟物流

    1.首先进入网址 http://www.kdniao.com/v2/IndexNew.aspx注册一个快递鸟账号,目前仅仅只是测试,我们注册的时候选择个人,企业随便填写就行了

    注册完,登录进来是这样的
    在这里插入图片描述

    账号认证的话,只资质认证就行了,有些都不需要填,这没有啥关系的

    在这里插入图片描述
    在这里插入图片描述

    购买物流查询套餐(免费)

    产品服务管理 - 》 物流查询 - 》免费套餐 - 》 点击购买

    在这里插入图片描述
    在这里插入图片描述

    查看API文档

    返回首页
    在这里插入图片描述

    点击“API文档” - 》即时查询API

    在这里插入图片描述

    API入参请求

    在这里插入图片描述

    下载即时查询接口Demo

    在这里插入图片描述

    压缩文件解压 只有这么一个类 我们打开看看/7

    在这里插入图片描述

    下面这些是下载下来的代码

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.UnsupportedEncodingException;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Map;
    import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
    import java.security.MessageDigest;
    
    package com.third_api.kdniao;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.UnsupportedEncodingException;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.HashMap;
    import java.util.Map;
    import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
    import java.security.MessageDigest;
    
    
    /**
     * @author Administrator
     * @技术QQ群: 可登录官网https://www.kdniao.com/右侧查看技术群号
     * @see: https://kdniao.com/api-track
     * @copyright: 深圳市快金数据技术服务有限公司
     * ID和Key请到官网申请:https://kdniao.com/reg
    
    
    
     * 即时查询接口
     * 此接口用于向快递公司实时查询物流轨迹信息。该功能支持情况需查看技术文档。
     * 正式地址:https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx
     *
     *
     * 系统级参数
     * RequestData	   String	R	请求内容为JSON格式 详情可参考接口技术文档:https://www.kdniao.com/documents
     * EBusinessID	   String	R	用户ID
     * RequestType	   String	R	请求接口指令
     * DataSign	       String	R	数据内容签名,加密方法为:把(请求内容(未编码)+ApiKey)进行MD5加密--32位小写,然后Base64编码,最后进行URL(utf-8)编码
     * DataType	       String	R	DataType=2,请求、返回数据类型均为JSON格式
    
    
     * 应用级参数
     * R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)
     * OrderCode	  String(30)	O	订单编号
     * ShipperCode	  String(10)	R	快递公司编码  详细编码参考《快递鸟接口支持快递公司编码.xlsx》 https://www.kdniao.com/documents
     * LogisticCode	  String(30)	R	快递单号
     * CustomerName	  String(50)	C	ShipperCode为SF时必填,对应寄件人/收件人手机号后四位;ShipperCode为其他快递时,可不填或保留字段,不可传值
    
     * 请求示例
     * ZTO请求示例:
     * {
     * "OrderCode": "",
     * "ShipperCode": "ZTO",
     * "LogisticCode": "638650888018",
     * }
     *
     * JD请求示例:
     * {
     * "OrderCode": "",
     * "CustomerName": "",
     * "ShipperCode": "JD",
     * "LogisticCode": "JDVA00003618100",
     * }
     *
     * SF请求示例:
     * {
     * "OrderCode": "",
     * "CustomerName": "1234",
     * "ShipperCode": "SF",
     * "LogisticCode": "SF00003618100",
     * }
     */
    
    public class KdApiSearchDemo {
    
        //用户ID,快递鸟提供,注意保管,不要泄漏
        /**
         * 即用户ID,登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
         */
        private String EBusinessID="1237100";
        /**
         * API key,快递鸟提供,注意保管,不要泄漏
         */
        private String ApiKey="56da2cf8-c8a2-44b2-b6fa-476cd7d1ba17";
        //即API key,登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
        /**
         * 请求url, 正式环境地址
         */
        private String ReqURL="https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx";
    
    
    
    
        public static void main(String[] args) {
            try {
                KdApiSearchDemo api = new KdApiSearchDemo();
                System.out.println(api.orderOnlineByJson());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * 即时查询接口
         */
        public String orderOnlineByJson() throws Exception{
            // 组装应用级参数
            String RequestData= "{"+
                    "'CustomerName': '',"+
                    "'OrderCode': '',"+
                    "'ShipperCode': 'YTO',"+
                    "'LogisticCode': 'YT00003618100',"+
                    "}";
            // 组装系统级参数
            Map<String,String> params = new HashMap<String,String>();
            params.put("RequestData", urlEncoder(RequestData, "UTF-8"));
            params.put("EBusinessID", EBusinessID);
            params.put("RequestType", "1002");
            //免费即时查询接口指令1002/在途监控即时查询接口指令8001/地图版即时查询接口指令8003
            String dataSign=encrypt(RequestData, ApiKey, "UTF-8");
            params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
            params.put("DataType", "2");
            // 以form表单形式提交post请求,post请求体中包含了应用级参数和系统级参数
            String result=sendPost(ReqURL, params);
    
            //根据公司业务处理返回的信息......
            return result;
        }
    
    
        /**
         * MD5加密
         * str 内容
         * charset 编码方式
         * @throws Exception
         */
        @SuppressWarnings("unused")
        private String MD5(String str,String charset) throws Exception {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(str.getBytes(charset));
            byte[] result = md.digest();
            StringBuffer sb = new StringBuffer(32);
            for (int i = 0; i < result.length; i++) {
                int val = result[i] & 0xff;
                if (val <= 0xf) {
                    sb.append("0");
                }
                sb.append(Integer.toHexString(val));
            }
            return sb.toString().toLowerCase();
        }
    
        /**
         * base64编码
         * str 内容
         * charset 编码方式
         * @throws UnsupportedEncodingException
         */
        private String base64(String str, String charset) throws UnsupportedEncodingException{
            String encoded = Base64.encode(str.getBytes(charset));
            return encoded;
        }
    
        @SuppressWarnings("unused")
        private String urlEncoder(String str, String charset) throws UnsupportedEncodingException{
            String result = URLEncoder.encode(str, charset);
            return result;
        }
    
        /**
         * 电商Sign签名生成
         * content 内容
         * keyValue ApiKey
         * charset 编码方式
         * @throws UnsupportedEncodingException ,Exception
         * @return DataSign签名
         */
        @SuppressWarnings("unused")
        private  String encrypt (String content,String keyValue,String charset) throws UnsupportedEncodingException, Exception
        {
            if (keyValue != null)
            {
                return base64(MD5(content + keyValue, charset), charset);
            }
            return base64(MD5(content, charset), charset);
        }
    
        /**
         * 向指定 URL 发送POST方法的请求
         * url 发送请求的 URL
         * params 请求的参数集合
         * @return 远程资源的响应结果
         */
        @SuppressWarnings("unused")
        private  String sendPost(String url, Map<String,String> params) {
            OutputStreamWriter out = null;
            BufferedReader in = null;
            StringBuilder result = new    StringBuilder();
            try {
                URL realUrl = new URL(url);
                HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection();
                // 发送POST请求必须设置如下两行
                conn.setDoOutput(true);
                conn.setDoInput(true);
                // POST方法
                conn.setRequestMethod("POST");
                // 设置通用的请求属性
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
                conn.setRequestProperty("user-agent",
                        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
                conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                conn.connect();
                // 获取URLConnection对象对应的输出流
                out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
                // 发送请求参数
                if (params != null) {
                    StringBuilder param = new    StringBuilder();
                    for (Map.Entry<   String,    String> entry : params.entrySet()) {
                        if(param.length()>0){
                            param.append("&");
                        }
                        param.append(entry.getKey());
                        param.append("=");
                        param.append(entry.getValue());
                        System.out.println(entry.getKey()+":"+entry.getValue());
                    }
                    System.out.println("param:"+param.toString());
                    out.write(param.toString());
                }
                // flush输出流的缓冲
                out.flush();
                // 定义BufferedReader输入流来读取URL的响应
                in = new BufferedReader(
                        new InputStreamReader(conn.getInputStream(), "UTF-8"));
                String line;
                while ((line = in.readLine()) != null) {
                    result.append(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            //使用finally块来关闭输出流、输入流
            finally{
                try{
                    if(out!=null){
                        out.close();
                    }
                    if(in!=null){
                        in.close();
                    }
                }
                catch(IOException ex){
                    ex.printStackTrace();
                }
            }
            return result.toString();
        }
    }
    
    
    
    
    

    我们把它代码更改

    在这里插入图片描述
    在这里插入图片描述
    修改代码就只有我上面两张图片里面圈出来的需要更改,其他不做改动。快去试试吧!

    展开全文
  • 【3】请求这个第三方接口: 【4】根据接口返回数据格式来解析数据: 在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口。 【1】准备工作: 在项目的工具包下导入HttpClientUtil这个工具...

    点击上方“Java基基”,选择“设为星标”

    做积极的人,而不是积极废人!

    源码精品专栏

     

    来源:blog.csdn.net/qq_35860138/

    article/details/82967727


    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口。

    【1】准备工作:

    在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的restTemplate来调用,上面有调用接口的方法【分为Get和Post方式的有参和无参调用】:

    package com.njsc.credit.util;
    
    import java.io.IOException;
    import java.net.URI;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.http.NameValuePair;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.utils.URIBuilder;
    import org.apache.http.entity.ContentType;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    
    public class HttpClientUtil {
    
     /**
      * 带参数的get请求
      * @param url
      * @param param
      * @return String
      */
     public static String doGet(String url, Map<String, String> param) {
      // 创建Httpclient对象
      CloseableHttpClient httpclient = HttpClients.createDefault();
    
      String resultString = "";
      CloseableHttpResponse response = null;
      try {
       // 创建uri
       URIBuilder builder = new URIBuilder(url);
       if (param != null) {
        for (String key : param.keySet()) {
         builder.addParameter(key, param.get(key));
        }
       }
       URI uri = builder.build();
       // 创建http GET请求
       HttpGet httpGet = new HttpGet(uri);
       // 执行请求
       response = httpclient.execute(httpGet);
       // 判断返回状态是否为200
       if (response.getStatusLine().getStatusCode() == 200) {
        resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
       }
      } catch (Exception e) {
       e.printStackTrace();
      } finally {
       try {
        if (response != null) {
         response.close();
        }
        httpclient.close();
       } catch (IOException e) {
        e.printStackTrace();
       }
      }
      return resultString;
     }
    
     /**
      * 不带参数的get请求
      * @param url
      * @return String
      */
     public static String doGet(String url) {
      return doGet(url, null);
     }
    
     /**
      * 带参数的post请求
      * @param url
      * @param param
      * @return String
      */
     public static String doPost(String url, Map<String, String> param) {
      // 创建Httpclient对象
      CloseableHttpClient httpClient = HttpClients.createDefault();
      CloseableHttpResponse response = null;
      String resultString = "";
      try {
       // 创建Http Post请求
       HttpPost httpPost = new HttpPost(url);
       // 创建参数列表
       if (param != null) {
        List<NameValuePair> paramList = new ArrayList<>();
        for (String key : param.keySet()) {
         paramList.add(new BasicNameValuePair(key, param.get(key)));
        }
        // 模拟表单
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
        httpPost.setEntity(entity);
       }
       // 执行http请求
       response = httpClient.execute(httpPost);
       resultString = EntityUtils.toString(response.getEntity(), "utf-8");
      } catch (Exception e) {
       e.printStackTrace();
      } finally {
       try {
        response.close();
       } catch (IOException e) {
        e.printStackTrace();
       }
      }
      return resultString;
     }
    
     /**
      * 不带参数的post请求
      * @param url
      * @return String
      */
     public static String doPost(String url) {
      return doPost(url, null);
     }
    
     /**
      * 传送json类型的post请求
      * @param url
      * @param json
      * @return String
      */
     public static String doPostJson(String url, String json) {
      // 创建Httpclient对象
      CloseableHttpClient httpClient = HttpClients.createDefault();
      CloseableHttpResponse response = null;
      String resultString = "";
      try {
       // 创建Http Post请求
       HttpPost httpPost = new HttpPost(url);
       // 创建请求内容
       StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
       httpPost.setEntity(entity);
       // 执行http请求
       response = httpClient.execute(httpPost);
       resultString = EntityUtils.toString(response.getEntity(), "utf-8");
      } catch (Exception e) {
       e.printStackTrace();
      } finally {
       try {
        response.close();
       } catch (IOException e) {
        e.printStackTrace();
       }
      }
      return resultString;
     }
    }
    

    【2】创建url和访问key 以及参数等:

    代码如下:

    /**
     * 聚合接口校验身份证
     * @param idCard
     * @param realName
     * @return boolean
     */
    public boolean identityCheck(String idCard, String realName){
     logger.info("-----------------调用聚合数据 身份证验证API BEGIN--------------->");
     String key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
     String url = "http://op.juhe.cn/idcard/query" + "?key=" + key + "&idcard=" + idCard + "&realname=" + realName;
     logger.info("请求url:" + url);
     boolean match = false; //是否匹配
     try {
      String result = HttpClientUtil.doGet(url);
      System.out.println("请求结果:" + result);
      IdentityCheckResult identityCheckResult = JsonUtils.parse(result, IdentityCheckResult.class);
      IdentityCheck identityCheck = JsonUtils.parse(result, "result", IdentityCheck.class);
      logger.info(identityCheckResult);
      logger.info(identityCheck.toString());
      if(identityCheckResult.correct() && identityCheck.getRes() == 1){
       match = true;
      }
     } catch (Exception e) {
      e.printStackTrace();
     }
     logger.info("<-----------------调用聚合数据 身份证验证API END---------------");
     return match;
    }
    

    【3】请求这个第三方接口:

    使用HttpClientUtil工具类中的doGet方法来请求URL,得到结果,现在大多数是一个json字符串,类型为String

    【4】根据接口返回数据格式来解析数据:

    可以看到,返回参数有六个,所以在项目中新建一个bean,包含以上六个字段,用来接住返回数据,如下:

    因为接口返回的数据是一个json的字符串,类型实际上是一个String字符串,要解析数据,用工具类JsonUtils的parse方法将字符串转换为Java对象,JsonUtils的代码如下:

    package com.eqianxian.commons.utils.json;
    
    import java.util.List;
    import java.util.Map;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.alibaba.fastjson.serializer.PropertyFilter;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    
    /**
     * 在系统中统一使用这个,以方便将来切换不同的JSON生成工具
     *
     * @author KelvinZ
     *
     */
    public class JsonUtils {
     public static final int TYPE_FASTJSON = 0;
     public static final int TYPE_GSON = 1;
    
     /**
      * <pre>
      * 对象转化为json字符串
      *
      * @param obj 待转化对象
      * @return 代表该对象的Json字符串
      */
     public static final String toJson(final Object obj) {
      return JSON.toJSONString(obj);
      // return gson.toJson(obj);
     }
    
     /**
      * <pre>
      * 对象转化为json字符串
      *
      * @param obj 待转化对象
      * @return 代表该对象的Json字符串
      */
     public static final String toJson(final Object obj, SerializerFeature... features) {
      return JSON.toJSONString(obj, features);
      // return gson.toJson(obj);
     }
    
     /**
      * 对象转化为json字符串并格式化
      *
      * @param obj
      * @param format 是否要格式化
      * @return
      */
     public static final String toJson(final Object obj, final boolean format) {
      return JSON.toJSONString(obj, format);
     }
    
     /**
      * 对象对指定字段进行过滤处理,生成json字符串
      *
      * @param obj
      * @param fields 过滤处理字段
      * @param ignore true做忽略处理,false做包含处理
      * @param features json特征,为null忽略
      * @return
      */
     public static final String toJson(final Object obj, final String[] fields, final boolean ignore,
       SerializerFeature... features) {
      if (fields == null || fields.length < 1) {
       return toJson(obj);
      }
      if (features == null)
       features = new SerializerFeature[] { SerializerFeature.QuoteFieldNames };
      return JSON.toJSONString(obj, new PropertyFilter() {
       @Override
       public boolean apply(Object object, String name, Object value) {
        for (int i = 0; i < fields.length; i++) {
         if (name.equals(fields[i])) {
          return !ignore;
         }
        }
        return ignore;
       }
      }, features);
     }
    
     /**
      * <pre>
      * 解析json字符串中某路径的值
      *
      * @param json
      * @param path
      * @return
      */
     @SuppressWarnings("unchecked")
     public static final <E> E parse(final String json, final String path) {
      String[] keys = path.split(",");
      JSONObject obj = JSON.parseObject(json);
      for (int i = 0; i < keys.length - 1; i++) {
       obj = obj.getJSONObject(keys[i]);
      }
      return (E) obj.get(keys[keys.length - 1]);
     }
    
     /**
      * <pre>
      * json字符串解析为对象
      *
      * @param json 代表一个对象的Json字符串
      * @param clazz 指定目标对象的类型,即返回对象的类型
      * @return 从json字符串解析出来的对象
      */
     public static final <T> T parse(final String json, final Class<T> clazz) {
      return JSON.parseObject(json, clazz);
     }
    
     /**
      * <pre>
      * json字符串解析为对象
      *
      * @param json json字符串
      * @param path 逗号分隔的json层次结构
      * @param clazz 目标类
      */
     public static final <T> T parse(final String json, final String path, final Class<T> clazz) {
      String[] keys = path.split(",");
      JSONObject obj = JSON.parseObject(json);
      for (int i = 0; i < keys.length - 1; i++) {
       obj = obj.getJSONObject(keys[i]);
      }
      String inner = obj.getString(keys[keys.length - 1]);
      return parse(inner, clazz);
     }
    
     /**
      * 将制定的对象经过字段过滤处理后,解析成为json集合
      *
      * @param obj
      * @param fields
      * @param ignore
      * @param clazz
      * @param features
      * @return
      */
     public static final <T> List<T> parseArray(final Object obj, final String[] fields, boolean ignore,
       final Class<T> clazz, final SerializerFeature... features) {
      String json = toJson(obj, fields, ignore, features);
      return parseArray(json, clazz);
     }
    
     /**
      * <pre>
      * 从json字符串中解析出一个对象的集合,被解析字符串要求是合法的集合类型
      * (形如:["k1":"v1","k2":"v2",..."kn":"vn"])
      *
      * @param json - [key-value-pair...]
      * @param clazz
      * @return
      */
     public static final <T> List<T> parseArray(final String json, final Class<T> clazz) {
      return JSON.parseArray(json, clazz);
     }
    
     /**
      * <pre>
      * 从json字符串中按照路径寻找,并解析出一个对象的集合,例如:
      * 类Person有一个属性name,要从以下json中解析出其集合:
      * {
      *  "page_info":{
      *   "items":{
      *    "item":[{"name":"KelvinZ"},{"name":"Jobs"},...{"name":"Gates"}]
      *  }
      * }
      * 使用方法:parseArray(json, "page_info,items,item", Person.class),
      * 将根据指定路径,正确的解析出所需集合,排除外层干扰
      *
      * @param json json字符串
      * @param path 逗号分隔的json层次结构
      * @param clazz 目标类
      * @return
      */
     public static final <T> List<T> parseArray(final String json, final String path, final Class<T> clazz) {
      String[] keys = path.split(",");
      JSONObject obj = JSON.parseObject(json);
      for (int i = 0; i < keys.length - 1; i++) {
       obj = obj.getJSONObject(keys[i]);
      }
      String inner = obj.getString(keys[keys.length - 1]);
      List<T> ret = parseArray(inner, clazz);
      return ret;
     }
    
     /**
      * <pre>
      * 有些json的常见格式错误这里可以处理,以便给后续的方法处理
      * 常见错误:使用了\" 或者 "{ 或者 }",腾讯的页面中常见这种格式
      *
      * @param invalidJson 包含非法格式的json字符串
      * @return
      */
     public static final String correctJson(final String invalidJson) {
      String content = invalidJson.replace("\\\"", "\"").replace("\"{", "{").replace("}\"", "}");
      return content;
     }
    
     /**
      * 格式化Json
      *
      * @param json
      * @return
      */
     public static final String formatJson(String json) {
      Map<?, ?> map = (Map<?, ?>) JSON.parse(json);
      return JSON.toJSONString(map, true);
     }
    
     /**
      * 获取json串中的子json
      *
      * @param json
      * @param path
      * @return
      */
     public static final String getSubJson(String json, String path) {
      String[] keys = path.split(",");
      JSONObject obj = JSON.parseObject(json);
      for (int i = 0; i < keys.length - 1; i++) {
       obj = obj.getJSONObject(keys[i]);
       System.out.println(obj.toJSONString());
      }
      return obj != null ? obj.getString(keys[keys.length - 1]) : null;
     }
    
    }
    
    - END -

    欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

    已在知识星球更新源码解析如下:

    最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

    提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

    获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

    文章有帮助的话,在看,转发吧。
    谢谢支持哟 (*^__^*)
    
    展开全文
  • 在Vue中使用第三方接口
  • 本篇案例分享第三方系统对接的设计思路!欢迎打卡,留言,交流更多解决方案!
  • 泛微 ecology9.0 第三方系统消息推送接口调用文档 .docx
  • 最近对接了一个第三方阿里云api的接口,过程并不是很顺利,所以把最后成功的代码作为案例发出来,为了方便对后面有需要的人,有一些参考把。代码没做太多封装 public List<ALaDingPrice> getPrice() throws ...
  • //调用第三方接口 @Slf4j @Component public class HaierStoreClient { @Value("${haier.store.url}") private String haierStoreUrl; @Value("${haier.mstore.url}") private String haierMStoreUrl; private ...
  • java调用第三方接口示例

    千次阅读 2020-05-20 17:48:30
    引言:在我们开发的过程中,常常会听到或者接触到第三方接口,那么这个第三方接口到底是什么呢? 简单来说就是一个远程接口,不是在你本机上的,你需要通过远程url去访问调用该接口。许多项目中有明确的要求需要调用...
  • Java后台对接第三方接口发送数据GET\POST\PUT工具类使用案例 工具类 //////////////////////////////GET//////////////////////////// /** * get请求 * * @param url 目标地址 * @param param 参数 * @return ...
  • 填入生成的公钥并保存、配置参数1.账号2.APPID跟网关四、代码部分1.依赖2.配置类①.支付宝公钥查看位置②.私钥PKCS8格式查看位置Controller层总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工...
  • 今天我们来聊聊,如何做好第三方系统对接

    千次阅读 多人点赞 2020-12-18 18:40:43
    无论你是做面向ToB、ToC还是ToG的业务,开发业务系统,永远也逃脱不了与第三方系统对接的命运,例如:常见的支付宝、微信支付平台对接、短信平台对接,还有单点登录对接,以及与友商的数据接口对接等等,大..
  • 017:对接第三方支付宝支付接口1 聚合支付平台架构课程内容安排2 聚合支付平台核心的设计思想3 支付宝官方Demo运行测试4 支付宝接口采用验证签名保证接口参数安全性5 支付宝接口同步回调(浏览器重定向)实现原理6 ...
  • 为了提高系统的性能,调用第三方服务,最好做成异步的,如果条件允许,最好用单独的服务器,或者几台服务器来做调用第三方接口,来提高业务逻辑的处理速度。当然,测试环境也可以用一台机器来做伪分布式。 实现方式...
  • 第三方支付接口怎么测试

    千次阅读 2022-03-23 19:18:40
    现在有不少测试朋友做的项目中,可能也会涉及到支付相关的功能。比如:做商城的,做...之前可能大家也都看到过或者听过一个bug损失4.6亿美金的惨痛教训或者身边也有发生过其他因为支付功能的bug导致直接损失的案例
  • 通过第三方支付公司与银行对接: 这种方式接方式的优缺点: 优点:系统只需要与第三方支付公司打交道,第三方支付公司根据用户选择的支付银行,并根据支付银行的接入规范,引导用户与银行对接,从而实现支付。此种...
  • 原文:对接第三方平台JAVA接口问题推送和解决 前言 本节所讲为实际项目中与第三方对接出现的问题最后还是靠老大解决了问题以此作为备忘录,本篇分为三小节,一小节解析Java加密接口数据,二小节解析XML文件需注意问题...
  • 针对游戏来说,使用第三方支付往游戏充值游戏币功能,看起来是不是很简单,大家主要思考下以下内容: 1、支付都是与第三方支付(支付宝、微信、财付通、QQ钱包、短信支付等)进行对接,那么,是否了解了第三方接口有...
  • * 根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数: 调用方法如下:... * String(21):第三天的 气温, 概况,风向和风力,图标一,图标二。String(22) 被查询的城市或地区的介绍 *
  • 第三方单点登录接入接口方案

    千次阅读 2021-08-09 20:22:50
    一、问题 目前我们有一套自己的oa系统,oa系统有个门户页面,我们...所以我的设计就是,让其他系统提供一个接口(/autherThirdLogin),接口url和参数我们来定义。这样我们只需要调用 接口,通知其他系统,这个用户需要
  • 文章目录1、永中 Office 实现在线 Office(1)永中 Office 介绍(2)项目需求对比(3)基本整合过程(4)调用逻辑图(5)实际使用案例 1、永中 Office 实现在线 Office (1)永中 Office 介绍 永中Office官网,相比...
  • 第三方单点登录接入接口方案 说明 一、问题 目前我们有一套自己的oa系统,oa系统有个门户页面,我们需要在这个门户上单点集成其他系统。每个其他系统都有自己的单点登陆方式,比如其他系统1使用token集成单点,其他...
  • //关闭设备通讯接口 [DllImport("mwrf32.dll", EntryPoint = "rf_exit", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)] public static ...
  •  电商平台和小程序都有物流模块,需要查询物流轨迹状态,一家家去对接顺丰、申通、中通、圆通、韵达、百世、邮政、EMS、京东、天天、德邦、安能等快递单号查询接口和电子面单API接口,是非常麻烦的,快递鸟集物流...
  • 推荐给大家很赞的第三方API接口: 一、交通出行 快递单号查询 快递鸟- 快递鸟目前支持418家国内外快递商,免费且没有使用次数限制。注:申请试用快递鸟API 可以免费【快递鸟】快递单号查询接口,免费电子面
  • 随着中国互联网的发展,业务... 例如:以前的程序员开发一个邮箱发送的邮件的功能,他可能需要自己搭建一个邮箱服务器(麻烦),而现在的开发者只需要找到邮箱服务提供商(如:阿里云),然后对接他们的服务。   如何...
  • 案例:API 接口案例

    2022-04-21 14:11:25
    第三方包express 和mysql2 ES6 模块化 Promise async/await 2. 主要的实现步骤 ① 搭建项目的基本结构 ② 创建基本的服务器 ③ 创建db 数据库操作模块 ④ 创建 user_ctrl 业务模块 ⑤ 创建 user_router ...
  • 如何高效的处理第三方接口数据?

    千次阅读 2019-07-16 22:17:24
    很多公司业务都需要进行第三方接口对接工作,特别是那种大部分数据都来自第三方的项目。比如亚马逊商家服务的saas系统,基本上所有的数据都来自亚马逊平台。 背景 像这种需要定期获取亚马逊接口数据,然后存储到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,217
精华内容 2,486
关键字:

对接第三方接口案例