快递鸟物流查询接口调用

jfinal框架 (java)(小白工作笔记)
http://www.kdniao.com/api-track 快递鸟官网接口(即时查询API)

订单号OrderCode为可选,快递公司编号ShipperCode、运单号LogisticCode必选
使用前需要申请官方ID,AppKey

String expCode = sod.getShipperCode();	//快递公司编号
String expNo = sod.getDeliveryNo();	//运单号

String requestData= "{'OrderCode':'','ShipperCode':'" + expCode + "','LogisticCode':'" + expNo + "'}";
Map<String, String> params = new HashMap<String, String>();
params.put("RequestData", urlEncoder(requestData, "UTF-8"));
//将快递鸟官方申请的ID,appkey和请求url放入配置文件,便于更改及使用时获取
params.put("EBusinessID", PropKit.use("third_api.properties").get("kdniao.EBusinessID"));//电商ID
params.put("RequestType", "1002");
String dataSign=encrypt(requestData, PropKit.use("third_api.properties").get("kdniao.AppKey"), "UTF-8");//官方申请的appkey
params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
params.put("DataType", "2");
String result=sendPost(PropKit.use("third_api.properties").get("kdniao.ReqURL"), params);**//请求调用查询物流的url**

//根据公司业务处理返回的信息......
  	JSONObject parseObj = JSONUtil.parseObj(result);
  	String success = parseObj.getStr("Success");
	Integer state = parseObj.getInt("State");

对于开源代码要学会拿过来根据自己的业务需求进行控制
一般免费的接口有调用次数限制,可以做个调用次数判断
官方sign签名、sendPost请求、编码、加密方式等如下,拿来即用

/**
    * 电商Sign签名生成
    * @param content 内容   
    * @param keyValue Appkey  
    * @param charset 编码方式
 * @throws UnsupportedEncodingException ,Exception
 * @return DataSign签名
    */
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方法的请求     
    * @param url 发送请求的 URL    
    * @param params 请求的参数集合     
    * @return 远程资源的响应结果
    */
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();
}
/**
    * MD5加密
    * @param str 内容       
    * @param charset 编码方式
 * @throws Exception 
    */
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编码
    * @param str 内容       
    * @param charset 编码方式
 * @throws UnsupportedEncodingException 
    */
private String base64(String str, String charset) throws UnsupportedEncodingException{
	String encoded = base64Encode(str.getBytes(charset));
	return encoded;    
}	
private static char[] base64EncodeChars = new char[] { 
     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 
     'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 
     'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 
     'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 
     'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 
     'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 
     'w', 'x', 'y', 'z', '0', '1', '2', '3', 
     '4', '5', '6', '7', '8', '9', '+', '/' }; 

public static String base64Encode(byte[] data) { 
    StringBuffer sb = new StringBuffer(); 
    int len = data.length; 
    int i = 0; 
    int b1, b2, b3; 
    while (i < len) { 
        b1 = data[i++] & 0xff; 
        if (i == len) 
        { 
            sb.append(base64EncodeChars[b1 >>> 2]); 
            sb.append(base64EncodeChars[(b1 & 0x3) << 4]); 
            sb.append("=="); 
            break; 
        } 
        b2 = data[i++] & 0xff; 
        if (i == len) 
        { 
            sb.append(base64EncodeChars[b1 >>> 2]); 
            sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); 
            sb.append(base64EncodeChars[(b2 & 0x0f) << 2]); 
            sb.append("="); 
            break; 
        } 
        b3 = data[i++] & 0xff; 
        sb.append(base64EncodeChars[b1 >>> 2]); 
        sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); 
        sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); 
        sb.append(base64EncodeChars[b3 & 0x3f]); 
    } 
    return sb.toString(); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值