精华内容
下载资源
问答
  • java对接第三方接口
    千次阅读
    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.调用第三方接口

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

    在这里插入图片描述

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

    在这里插入图片描述

    与第三方接口对接就完成了
    展开全文
  • java 对接第三方接口

    千次阅读 2020-09-25 22:16:25
    这是我一次要写对外的接口,一开始还是比较迷茫的,因为要考虑到数据的安全传输,很多技术我都还是比较的不熟悉,后来经过对每一个技术的了解,终于还是写出来了。 感觉一切都是从陌生到熟悉,再到亲切 哈哈哈哈哈...

    感想

    这是我第一次要写对外的接口,一开始还是比较迷茫的,因为要考虑到数据的安全传输,很多技术我都还是比较的不熟悉,后来经过对每一个技术的了解,终于还是写出来了。

    感觉一切都是从陌生到熟悉,再到亲切 哈哈哈哈哈

    如有错误,希望指出, 共同学习

    技术

    我会把所有的封装的工具类都给出来

    1: 使用Rsa非对称的加密算法,对传输的参数进行加密 (需要一个公钥和一个私钥)

    2: 使用md5 进行加签,验证身份是否正确

    3:使用hutool工具中的HttpUtil进行请求

    4:http://web.chacuo.net/netrsakeypair 通过这个网址可以在线生成公钥和私钥的密钥对,一般1024位就足够了,我这边就随机生成了密钥如下

    公钥:
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRgMigO0vUZCOXcSbylyBHssPh
    4qNMwZLIM9pbAmUZldATE2QfI5XAwQuEeo8LapP9Mf+TxXpQytevYs+EYcvaExOe
    BhJv9T6QFe2vxV6oJ+iDP2nMFGOqCK7+MJYWh4CYyl+PvuGnu+wMCDRGBI6u+09Z
    w/RnlWP6MMv7KlvhawIDAQAB
    私钥:
    MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANGAyKA7S9RkI5dx
    JvKXIEeyw+Hio0zBksgz2lsCZRmV0BMTZB8jlcDBC4R6jwtqk/0x/5PFelDK169i
    z4Rhy9oTE54GEm/1PpAV7a/FXqgn6IM/acwUY6oIrv4wlhaHgJjKX4++4ae77AwI
    NEYEjq77T1nD9GeVY/owy/sqW+FrAgMBAAECgYBm4g+kYHpEu0ifPnoZ+A1qKGf5
    rgrzzrv+hTheKTbs8Z1VQNiSUi9gkWzOikFlIdm7JaqVLw16T6LMBoJSSJSKiAwF
    4KyWtbccupplAgE5LGp2tmukt4tIR+noMH/NHnxMgZ6BMGJvQd7R66hHzvU7bZkA
    rNEoG78r7vBuhDPVAQJBAOl9IGCTpHxRqheiLKFxgbcdfb/3YjcjIFw4Y70BtImn
    sTsykBOdPHZvWdVwT5Gg/mwhGMG10sEFXY7/xSlRXfECQQDls6bYEJXfxoHyZwFa
    ++NTTTEk0C9sPOl7MW6m7rLSDkUN6TS/qjyHnkPF/05FIq2LxdgX7dqpKvGI8hfu
    kYkbAkBx8w8KEwQDaBeK0SrW335ez5W/Sgw0vH/egearJ1nklGJ6cYK/D82iP1Wo
    RNeQSvHf84cRgpsIeIXgdBLUx1EBAkAsEFaFREk78DylX5Um+wMUy84NndI7FURE
    2aq8YzXyjcI5dO8lhWavLXEa3msJYCmikoVtsbcslIxZFPf6T/jZAkBjG/bTsxDt
    7v9tb20APb5O+8wHC1UKpUQ+24iAjXB4U+BXWMeTqkoYwVMv6cB/3eXSMcM2KB+M
    xpFJK39x/Y9s
    

    实战

    直接上代码

    //公钥, 我这边直接写在代码里面,你也可以写在一个文件里面,再去文件里面读取
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRgMigO0vUZCOXcSbylyBHssPh
    4qNMwZLIM9pbAmUZldATE2QfI5XAwQuEeo8LapP9Mf+TxXpQytevYs+EYcvaExOe
    BhJv9T6QFe2vxV6oJ+iDP2nMFGOqCK7+MJYWh4CYyl+PvuGnu+wMCDRGBI6u+09Z
    w/RnlWP6MMv7KlvhawIDAQAB
    //私钥 我这边直接写在代码里面,你也可以写在一个文件里面,再去文件里面读取
        MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANGAyKA7S9RkI5dx
    JvKXIEeyw+Hio0zBksgz2lsCZRmV0BMTZB8jlcDBC4R6jwtqk/0x/5PFelDK169i
    z4Rhy9oTE54GEm/1PpAV7a/FXqgn6IM/acwUY6oIrv4wlhaHgJjKX4++4ae77AwI
    NEYEjq77T1nD9GeVY/owy/sqW+FrAgMBAAECgYBm4g+kYHpEu0ifPnoZ+A1qKGf5
    rgrzzrv+hTheKTbs8Z1VQNiSUi9gkWzOikFlIdm7JaqVLw16T6LMBoJSSJSKiAwF
    4KyWtbccupplAgE5LGp2tmukt4tIR+noMH/NHnxMgZ6BMGJvQd7R66hHzvU7bZkA
    rNEoG78r7vBuhDPVAQJBAOl9IGCTpHxRqheiLKFxgbcdfb/3YjcjIFw4Y70BtImn
    sTsykBOdPHZvWdVwT5Gg/mwhGMG10sEFXY7/xSlRXfECQQDls6bYEJXfxoHyZwFa
    ++NTTTEk0C9sPOl7MW6m7rLSDkUN6TS/qjyHnkPF/05FIq2LxdgX7dqpKvGI8hfu
    kYkbAkBx8w8KEwQDaBeK0SrW335ez5W/Sgw0vH/egearJ1nklGJ6cYK/D82iP1Wo
    RNeQSvHf84cRgpsIeIXgdBLUx1EBAkAsEFaFREk78DylX5Um+wMUy84NndI7FURE
    2aq8YzXyjcI5dO8lhWavLXEa3msJYCmikoVtsbcslIxZFPf6T/jZAkBjG/bTsxDt
    7v9tb20APb5O+8wHC1UKpUQ+24iAjXB4U+BXWMeTqkoYwVMv6cB/3eXSMcM2KB+M
    xpFJK39x/Y9s
    //这个key是md5加密的时候用的
     YUJDED15DDS65DHF12FHF125FHF5FFKF
    
    

    controller对外接口

        //这边使用post的请求
    	@PostMapping("hello")
        @Transactional
        public Object collectCpn(@RequestBody String body) {
    
            //这边使用jackson,将请求的json数据转为字符串
            String name = JacksonUtil.parseString(body, "name"); //名字
            String createTimeStamp = JacksonUtil.parseString(body, "create_time_stamp");//时间戳
            String sign = JacksonUtil.parseString(body, "sign");//签名
    
            //判断传过来的参数是否为空
            if(name.isEmpty()) {
                return "参数错误"
            }
    
            //参数 ascii排序 从小到大排序(除sign外)
            Map<String, Object> parameters = new TreeMap<>();
            parameters.put("name", name);
            parameters.put("create_time_stamp", createTimeStamp);
            //排序完的字符串后面添加 key的值
            String str = AsciiSortUtil.AsciiSort(parameters).append("key=" + key).toString();
    
            Map<String, Object> data = new HashMap<>();
            try {
                //私钥解密 请求的时候用公钥对签名进行加密,接收的时候,就需要用私钥解密
                sign = RsaUtils.decrypt(sign, rsaPrivateKey);
                //验签
                if(!Md5SignUtils.verifySign(str, key, sign)) {
                    //验签失败
                    return "签名错误";
                }
                //解密之后的数据 (私钥解密)
                name = RsaUtils.decrypt(name, rsaPrivateKey);
    
                //中间对数据库操作省略  可以对拿到的参数进行判断,处理(每个人都不同)
    
                //请求成功
                return "请求成功";
            }catch (Exception e){
                e.printStackTrace();
                //系统内部错误
                return ReturnUtil.errorSys(reqNo);
            }
        }
    

    单元测试方法

    private static String key = "YUJDED15DDS65DHF12FHF125FHF5FFKF";	
    private static String rsaPublickKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRgMigO0vUZCOXcSbylyBHssPh
    4qNMwZLIM9pbAmUZldATE2QfI5XAwQuEeo8LapP9Mf+TxXpQytevYs+EYcvaExOe
    BhJv9T6QFe2vxV6oJ+iDP2nMFGOqCK7+MJYWh4CYyl+PvuGnu+wMCDRGBI6u+09Z
    w/RnlWP6MMv7KlvhawIDAQAB";
        
    private static String url = "http://127.0.0.1:8080/hello"; //请求地址
        
    	@Test
        public void test1() {
            String name = "小小";
            String create_time_stamp = DateTimeUtil.getTimeStamp(); //时间戳
            try {
                //参数加密
                name = RsaUtils.encrypt(ordnameer_no, rsaPublickKey);
                //参数 ascii排序 从小到大排序(除了sign外)
                Map<String, Object> parameters = new TreeMap<>();
                parameters.put("name", name);
                parameters.put("create_time_stamp", create_time_stamp);
    			 //排序完的字符串后面添加 key的值
                String str = AsciiSortUtil.AsciiSort(parameters).append("key=" + key).toString();
    
                //使用md5对拼接完的字符串进行加密
                String sign = Md5SignUtils.sign(str, key).toUpperCase();
                //公钥加密
                sign = RsaUtils.encrypt(sign, rsaPublickKey); 
    
                Map<String, Object> data = new HashMap<>();
                data.put("name", name);
                data.put("create_time_stamp", create_time_stamp);
                data.put("sign", sign);
    			//使用hutool工具包,发送post请求
                String post = HttpUtil.post(url, JSON.toJSONString(data));
    			//这边就可以拿到请求返回的结果
                String code = JacksonUtil.parseString(post, "code");
                String returnSign = JacksonUtil.parseString(post, "sign");
    
            }catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    

    工具类

    RsaUtils

    import org.apache.commons.codec.binary.Base64;
    
    import javax.crypto.Cipher;
    import java.security.*;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @Author: Abe
     * Date: 2020/9/18 15:57
     */
    public class RsaUtils {
    
        /**
         * RSA公钥加密
         *
         * @param str
         *            加密字符串
         * @param publicKey
         *            公钥
         * @return 密文
         * @throws Exception
         *             加密过程中的异常信息
         */
        public static String encrypt( String str, String publicKey ) throws Exception{
            //base64编码的公钥
            byte[] decoded = Base64.decodeBase64(publicKey);
            RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
            //RSA加密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pubKey);
            String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
            return outStr;
        }
    
    
        /**
         * RSA私钥加密
         *
         * @param str
         *            加密字符串
         * @param privateKey
         *            私钥
         * @return 密文
         * @throws Exception
         *             加密过程中的异常信息
         */
        public static String encryptPrivateKey( String str, String privateKey) throws Exception{
            //base64编码的私钥
            byte[] decoded = Base64.decodeBase64(privateKey);
            RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
            //RSA加密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, priKey);
            String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
            return outStr;
        }
    
        /**
         * RSA私钥解密
         *
         * @param str
         *            加密字符串
         * @param privateKey
         *            私钥
         * @return 铭文
         * @throws Exception
         *             解密过程中的异常信息
         */
        public static String decrypt(String str, String privateKey) throws Exception{
            //64位解码加密后的字符串
            byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
            //base64编码的私钥
            byte[] decoded = Base64.decodeBase64(privateKey);
            RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
            //RSA解密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, priKey);
            String outStr = new String(cipher.doFinal(inputByte));
            return outStr;
        }
    
        /**
         * RSA公钥解密
         *
         * @param str
         *            加密字符串
         * @param publicKey
         *            私钥
         * @return 铭文
         * @throws Exception
         *             解密过程中的异常信息
         */
        public static String decryptPubKey(String str, String publicKey) throws Exception{
            //64位解码加密后的字符串
            byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
            //base64编码的公钥
            byte[] decoded = Base64.decodeBase64(publicKey);
            RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
            //RSA解密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, pubKey);
            String outStr = new String(cipher.doFinal(inputByte));
            return outStr;
        }
    
    }
    

    DateTimeUtil

    import java.text.SimpleDateFormat;
    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.time.format.DateTimeFormatter;
    import java.util.Date;
    
    /**
     * 生成时间戳
     */
    public class DateTimeUtil {
    
        /**
         * 生成时间戳
         * 格式: yyyyMMddHH24MISS 
         	说明:我这边加8个小时 是因为我线上环境的原因,你可以不用加
         *
         * @param
         * @return
         */
        public static String getTimeStamp() {
            LocalDateTime localDateTime = LocalDateTime.now().plusHours(8);
            Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    
            String timeStamp=new SimpleDateFormat("yyyyMMddHHmmss").
                    format(date.getTime());
            return timeStamp;
        }
    
    }
    

    AsciiSortUtil

    package org.linlinjava.litemall.core.util;
    
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * @Author: Abe
     * Date: 2020/9/23 17:52
     */
    public class AsciiSortUtil {
    
        /**
         * 参数名按ASCII码从小到大排序
         * @return
         */
        public static StringBuffer AsciiSort(Map<String,Object> parameters) {
            StringBuffer sbkey = new StringBuffer();
            // entrySet 所有参与传参的参数按照accsii排序(升序)
            Set es = parameters.entrySet();
            Iterator it = es.iterator();
    
            while (it.hasNext()) {
                Map.Entry entry = (Map.Entry) it.next();
                String k = (String) entry.getKey();
                Object v = entry.getValue();
                //空值不传递,不参与签名组串
                if (null != v && !"".equals(v)) {
                    sbkey.append(k + "=" + v + "&");
                }
            }
    //        sbkey = sbkey.append("key=" + key);
    //        System.out.println(sbkey);
            return sbkey;
        }
    
    }
    
    

    Md5SignUtils

    import java.security.MessageDigest;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @Author: Abe
     * Date: 2020/9/18 21:55
     */
    public class Md5SignUtils {
        static char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
        static String MD5 = "MD5";//加签方式:MD5
    
        /*
         * @Author boy
         * @Description 数据签名
         * @Date 2019/8/31 1:57 PM
         * @Param [data, key]
         * @return java.lang.String
         */
        public static String sign(String data, String key) throws Exception {
            //得到明文的字节数组
            byte[] btInput = (data + key).getBytes();
            // 创建一个提供信息摘要算法的对象(MD5摘要算法)
            MessageDigest messageDigest = MessageDigest.getInstance(MD5);
            // 使用指定的字节更新摘要
            messageDigest.update(btInput);
            // 得到二进制的密文
            byte[] encryptData = messageDigest.digest();
            // 把密文转换成十六进制的字符串形式
            String encryptDataStr = bytesToHex(encryptData);
            return encryptDataStr;
    
        }
    
        /*
         * @Author boy
         * @Description 验签
         * @Date 2019/8/31 1:57 PM
         * @Param [data, key, sign][明文数据,签名key,接收到的签名]
         * @return boolean
         */
        public static boolean verifySign(String data, String key, String sign) throws Exception {
            //调用加签方法,看加签后的签名是否和接收到的一致
            String encryptData = sign(data, key);
            //转为大写
            encryptData = encryptData.toUpperCase();
            if (encryptData.equals(sign)) {
                return true;
            } else {
                return false;
            }
        }
    
        /*
         * @Author boy
         * @Description 将byte数组转化为16进制字符串
         * @Date 2019/8/31 1:58 PM
         * @Param [bytes]
         * @return java.lang.String
         */
        public static String bytesToHex(byte[] bytes) {
            int k = 0;
            char[] hexChars = new char[bytes.length * 2];
            for (int i = 0; i < bytes.length; i++) {
                byte byte0 = bytes[i];
                hexChars[k++] = hexDigits[byte0 >>> 4 & 0xf];
                hexChars[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(hexChars);
        }
    
    }
    

    JacksonUtil

    package org.linlinjava.litemall.core.util;
    
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.JsonNode;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import java.io.IOException;
    import java.util.List;
    
    import org.linlinjava.litemall.db.domain.LitemallUser;
    
    public class JacksonUtil {
        public static String parseString(String body, String field) {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = null;
            try {
                node = mapper.readTree(body);
                JsonNode leaf = node.get(field);
                if (leaf != null)
                    return leaf.asText();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
    
        public static List<String> parseStringList(String body, String field) {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = null;
            try {
                node = mapper.readTree(body);
                JsonNode leaf = node.get(field);
    
                if (leaf != null)
                    return mapper.convertValue(leaf, new TypeReference<List<String>>() {
                    });
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static Integer parseInteger(String body, String field) {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = null;
            try {
                node = mapper.readTree(body);
                JsonNode leaf = node.get(field);
                if (leaf != null)
                    return leaf.asInt();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static List<Integer> parseIntegerList(String body, String field) {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = null;
            try {
                node = mapper.readTree(body);
                JsonNode leaf = node.get(field);
    
                if (leaf != null)
                    return mapper.convertValue(leaf, new TypeReference<List<Integer>>() {
                    });
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        
        public static LitemallUser parseLitemallUser(String body, String field) {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = null;
            try {
                node = mapper.readTree(body);
                JsonNode leaf = node.get(field);
    
                if (leaf != null)
                    return mapper.convertValue(leaf, new TypeReference<LitemallUser>() {
                    });
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
    
        public static Boolean parseBoolean(String body, String field) {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = null;
            try {
                node = mapper.readTree(body);
                JsonNode leaf = node.get(field);
                if (leaf != null)
                    return leaf.asBoolean();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static Short parseShort(String body, String field) {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = null;
            try {
                node = mapper.readTree(body);
                JsonNode leaf = node.get(field);
                if (leaf != null) {
                    Integer value = leaf.asInt();
                    return value.shortValue();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static Byte parseByte(String body, String field) {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = null;
            try {
                node = mapper.readTree(body);
                JsonNode leaf = node.get(field);
                if (leaf != null) {
                    Integer value = leaf.asInt();
                    return value.byteValue();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static <T> T parseObject(String body, String field, Class<T> clazz) {
            ObjectMapper mapper = new ObjectMapper();
            JsonNode node = null;
            try {
                node = mapper.readTree(body);
                node = node.get(field);
                return mapper.treeToValue(node, clazz);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public static Object toNode(String json) {
            if (json == null) {
                return null;
            }
            ObjectMapper mapper = new ObjectMapper();
            try {
                JsonNode jsonNode = mapper.readTree(json);
                return jsonNode;
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
    }
    
    展开全文
  • 主要介绍了Java调用第三方接口示范的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 介绍一些快速对接第三方接口的工具类和一些开发的效率软件

    🦆博主介绍:小黄鸭技术

    🌈擅长领域:Java、实用工具、运维

    👀 系列专栏:📢Java之路 

    📧如果文章写作时有错误的地方,请各位大佬指正,一起进步!!!

    🧡欢迎大家点赞➕收藏⭐➕评论💬支持博主🤞  


    参数拼接

    JSON转实体类

    先安装插件

    Json转换

    实体类转建表语句工具

    ​编辑 maven依赖

    添加字段的含义

    生成建表语句

    根据表生成Mybatis-Plus Dao层文件

    MyBatisX插件

    生成mapper和XML文件


    参数拼接

    将参数以 字段名=参数&字段名=参数 的方式拼接

    例如:

    name=duck&sex=1&age=18

        public static String getParam(Map<String, String> map) throws Exception {
            StringBuilder param = new StringBuilder();
            for (Map.Entry<String, String> entry : map.entrySet()) {
                param.append(entry.getKey()).append("=").append(URLEncoder.encode(String.valueOf(entry.getValue()), "UTF-8")).append("&");
            }
            param = new StringBuilder(param.substring(0, param.length() - 1));
            return param.toString();
        }

    JSON转实体类

    一般我们对接完接口时会返回我们JSON结构的数据,我们需要根据返回的JSON字符串来生成对应的实体类,一般我会用IDEA 的插件 GsonFormat-Plus 来快速生成接收实体类。

    先安装插件

    Json转换


    实体类转建表语句工具

     maven依赖

    <dependency>
        <groupId>io.swagger</groupId>
        <artifactId>swagger-annotations</artifactId>
        <version>1.6.2</version>
    </dependency>

    主要用于利用Swagger的注解来标注字段的含义,通过解析注解来生成建表语句的相关备注。

    添加字段的含义

    生成建表语句

    package com.duck.api;
    
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    
    import java.lang.reflect.Field;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Objects;
    
    
    public class CreateSqlByClass {
        private static final Class<?> CLS = User.class;
        private static final String LINE = "\r\n";
        private static Map<String, String> map = new LinkedHashMap<String, String>();
    
        public static void main(String[] args) throws Exception {
            // 获取建表 SQL
            createSQL();
        }
    
        /**
         * 获取建表SQL(执行后控制台会自动输出建表语句SQL)
         */
        private static void createSQL() throws Exception {
            StringBuilder sb = new StringBuilder();
            sb.append("CREATE TABLE `").append(getSqlAttrName(CLS.getSimpleName())).append("` (").append(LINE);
            sb.append("  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',").append(LINE);
            sb.append("  `create_time` datetime DEFAULT NULL COMMENT '创建时间',").append(LINE);
            sb.append("  `update_time` datetime DEFAULT NULL COMMENT '创建时间',").append(LINE);
            sb.append("  `deleted` tinyint DEFAULT 0 COMMENT '是否已删除:0-未删除,1-已删除',").append(LINE);
            sb.append("  `version` tinyint DEFAULT 0 COMMENT '版本号',").append(LINE);
    
            // 获取其他参数
            Field[] fields = CLS.getDeclaredFields();
            for (Field field : fields) {
                String type = field.getType().getSimpleName();
                String key = getSqlAttrName(field.getName());
                String comment = getComment(field, false);
                switch (type) {
                    case "String":
                        sb.append("  `").append(key).append("` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ").append(comment).append(",")
                                .append(LINE);
                        break;
                    case "int":
                    case "Integer":
                        comment = getComment(field, true);
                        if (isStatusAndType(field.getName())) {
                            sb.append("  `").append(key).append("` tinyint(2) DEFAULT 0 COMMENT ").append(comment).append(",")
                                    .append(LINE);
                        } else {
                            sb.append("  `").append(key).append("` int(11) DEFAULT 0 COMMENT ").append(comment).append(",")
                                    .append(LINE);
                        }
                        break;
                    case "long":
                    case "Long":
                        comment = getComment(field, true);
                        sb.append("  `").append(key).append("` bigint(20) DEFAULT 0 COMMENT ").append(comment).append(",")
                                .append(LINE);
                        break;
                    case "Date":
                        sb.append("  `").append(key).append("` datetime DEFAULT NULL COMMENT ").append(comment).append(",")
                                .append(LINE);
                        break;
                    case "List":
                        sb.append("  `").append(key).append("` json DEFAULT NULL COMMENT ").append(comment).append(",")
                                .append(LINE);
                        break;
                    case "BigDecimal":
                        sb.append("  `").append(key).append("` decimal(16,4) DEFAULT NULL COMMENT ").append(comment).append(",")
                                .append(LINE);
                        break;
                    default:
                        throw new Exception("未知属性类型:" + type);
                }
            }
            sb.append("  PRIMARY KEY (`id`)").append(LINE);
            sb.append(") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT'").append(getApiModelName())
                    .append("表';").append(LINE);
            System.out.println("-- 创建表SQL");
            System.out.println(sb.toString());
        }
    
        /**
         * 大小写转换成_拼接
         * **/
        private static String getSqlAttrName(String attr) {
            char[] array = attr.toCharArray();
            StringBuilder sb = new StringBuilder();
            int idx = 0;
            for (char c : array) {
                if (c >= 'a' && c <= 'z') {
                    sb.append(c);
                } else {
                    if (idx > 0) {
                        sb.append("_");
                    }
                    sb.append(String.valueOf(c).toLowerCase());
                }
                idx++;
            }
            return sb.toString();
        }
    
        /**
         * 获取类的名称注解
         * */
        private static String getApiModelName() {
            ApiModel model = CLS.getAnnotation(ApiModel.class);
            if (Objects.isNull(model)) {
                return "";
            }
            return model.value();
        }
    
        private static String getComment(Field field, boolean isNumber) {
            String sqlFiledName = getSqlAttrName(field.getName());
            ApiModelProperty property = field.getAnnotation(ApiModelProperty.class);
            if (Objects.isNull(property)) {
                if (isNumber) {
                    map.put(sqlFiledName, "0");
                } else {
                    map.put(sqlFiledName, "NULL");
                }
                return "''";
            }
            // 是否有默认值
            String expmale = property.example();
            if (isNumber) {
                map.put(sqlFiledName, expmale);
            } else {
                map.put(sqlFiledName, "'" + expmale + "'");
            }
            return "'" + property.value() + "'";
        }
    
        private static boolean isStatusAndType(String s) {
            s = s.toLowerCase();
            return s.endsWith("status") || s.endsWith("type");
        }
    }
    

    根据表生成Mybatis-Plus Dao层文件

    MyBatisX插件

    设置数据库信息

    如果不显示表,就打开 架构/schemas 中勾选要在idea中展示的表。

    生成的文件如下

    🧡欢迎大家点赞➕收藏⭐➕评论💬支持博主🤞   

    展开全文
  • Java对接第三方接口 定时任务 Get请求 Post请求 1.添加依赖 <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <dependency> <groupId>org.apache....
  • Java 调用第三方接口方法

    千次阅读 2022-04-25 11:21:39
    Java 调用第三方接口方法 一、 通过JDK网络类Java.net.HttpURLConnection 1.java.net包下的原生java api提供的http请求 使用步骤: 1、通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection)。 ...
  • JAVA调用第三方接口方法
  • 对接第三方接口–使用post请求发送json数据实习4个多月,终于转正!终于可以安心好好上班,好好学习!第一篇播客记录下工作中的中的小知识点。本文记录的内容如下:1.使用HttpClient相关类,包括PostMethod,Request...
  • Java调用第三方接口示范

    万次阅读 多人点赞 2018-10-08 15:03:53
    在项目开发中经常会遇到调用第三方接口的情况,比如说调用第三方的天气预报接口。 使用流程 【1】准备工作:在项目的工具包下导入HttpClientUtil这个工具类,或者也可以使用Spring框架的restTemplate来调用,上面...
  • java开发工具类httpclient-4.5.jar,httpcore-4.4.6.jar,commons-logging-1.2.jar,commons-httpclient-3.1.jar,commons-logging-1.2.jar,commons-codec-1.9.jar,commons-collections-3.2.2.jar,commons-...
  • Java调用第三方http接口的常用方式

    千次阅读 多人点赞 2021-09-02 11:15:59
    Java项目中调用第三方接口的常用方式有: ①通过JDK网络类Java.net.HttpURLConnection; ②通过common封装好的HttpClient; ③通过Apache封装好的CloseableHttpClient; ④通过SpringBoot-RestTemplate; 2....
  • 针对以上蚂蚁金服的面试题我整理了一些Java面试题,如果有需要的可以在文末免费获取哦! 福利 内容真的很丰富!上图!看看就知道了! Jvm 并发 Mysql 全部的(不一一截图了) 最后 无论是哪家公司,都很重视基础,...
  • 目的用户在下单的时候,会调用我们的后台服务器,我们的后台服务器又会根据不同渠道调用第三方下单接口,完成整个下单流程,但是第三方下单接口可能突然出问题或者不支持,所以目前我们每一种渠道都配置了好几种备用...
  • 对接第三方接口

    2022-02-22 16:17:01
    * @Description http调用第三方接口 **/ public class HttpClientUtil { /** * 带参数的get请求 * * @param url * @param param * @return String */ public static String doGet(String url, Map<...
  • Java调用第三方接口获取数据方法

    千次阅读 2019-09-09 23:46:42
    java实现调用第三方接口获取数据 最近学习向第三方接口发出http请求,获取返回数据进行存储,把内容总结一下。 几种方法 查了一些资料,总共有这么几种方法发出http请求: javaJava.net.HttpURLConnection类实现 ...
  • 通常我们的系统在与第三方系统对接的时候,有许多种方式实现:系统api接口、共享缓存、数据库共享、调用消息队列、页面跳转、共享数据文件等,在实际生产中,系统api接口对接方式是占了很大部分的。 最近,我...
  • public static String post(String url, HashMap<String, Object> textMap) { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); CloseableHttpResponse httpResponse = null;...
  • Java连接第三方接口获取数据

    千次阅读 2022-05-04 23:21:48
    一步 pom文件添加如下依赖 <!--HttpClient--> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1&...
  • java springboot调用第三方接口获取的token用于接下来的请求, 可以不存数据库吗
  • 填入生成的公钥并保存、配置参数1.账号2.APPID跟网关四、代码部分1.依赖2.配置类①.支付宝公钥查看位置②.私钥PKCS8格式查看位置Controller层总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工...
  • 简单对接第三方接口TestDemo对接快递鸟物流 对接快递鸟物流 1.首先进入网址 http://www.kdniao.com/v2/IndexNew.aspx注册一个快递鸟账号,目前仅仅只是测试,我们注册的时候选择个人,企业随便填写就行了 注册完,...
  • Java调用第三方http或https接口的方式

    千次阅读 2020-08-17 18:37:25
    Java项目中调用第三方接口的方式有: ①通过JDK网络类Java.net.HttpURLConnection; ②通过Apache common封装好的HttpClient; ③通过Apache封装好的CloseableHttpClient; ④通过SpringBoot-RestTempl
  • 最近,在做支付功能的第三方接口对接工作 这里发现接口都有个共同点 1,需要秘钥 2,传参方式相同 : API采用 HTTPS 协议进行数据传输,数据传输格式统一为JSON。 3,返参方式 : API处理完成交易后,以 JSON 数据格式将...
  • RestTemplate解决对接接口的乱码问题解决方案
  • java调用第三方接口示例

    千次阅读 2020-05-20 17:48:30
    引言:在我们开发的过程中,常常会听到或者接触到第三方接口,那么这个第三方接口到底是什么呢? 简单来说就是一个远程接口,不是在你本机上的,你需要通过远程url去访问调用该接口。许多项目中有明确的要求需要调用...
  • Java后台对接第三方接口发送数据GET\POST\PUT工具类使用案例 工具类 //////////////////////////////GET//////////////////////////// /** * get请求 * * @param url 目标地址 * @param param 参数 * @return ...

空空如也

空空如也

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

java对接第三方接口