程序員在上海之三

今天在公司的任務是完成定時任務激活老用戶發短息功能上線,其實這個功能在昨天就已經完成了,由於運維同事在發佈的時候漏掉了,導致今天在查看日誌的時候沒有看到 ,有點出乎意料,我的代碼明明很簡潔明瞭功能明確!爲什麼會有這樣的問題?只好查詢版本才發現線上沒有發佈我的最新代碼,好吧~問題找到了,現在有一個兩全的方法,我們的admin系統有一個手動走定時任務的功能,花了幾分鐘添加上去測試OK~下午上線。

工作描述基本結束了,下面是個人今天的技術分享:我們都知道網上有很多頁面可以根據身份證查詢歸屬地、性別、出生日期等;根據手機號碼查詢歸屬地。可是具體它是怎麼實現的呢?作爲一個程序員,知識和經驗是在項目和平時的學習中積累的,下面是一個關於查詢身份證信息的介紹和具體實現代碼:

-------------------------------說明文檔---------------------------------------------

接口地址:http://apis.juhe.cn/idcard/index
支持格式:json/xml
請求方式:get
請求示例:http://apis.juhe.cn/idcard/index?key=您申請的KEY&cardno=330326198903081211
請求參數說明:
  名稱 類型 必填 說明
  cardno string Y 身份證號碼
  dtype string Y 返回數據格式:json或xml,默認json
  key string Y 你申請的key
返回參數說明:
  名稱 類型 說明
        error_code  int                                 返回碼
         reason  string                                 返回說明
         data  -                                 返回結果集
  area  string                                 地區
  sex  string                                 性別
  birthday  string                                 出生日期
JSON返回示例:
{
"resultcode":"200",
"reason":"成功的返回",
"result":{
	"area":"浙江省溫州市平陽縣",
	"sex":"男",
	"birthday":"1989年03月08日"
}
}
XML返回示例:
<root>
<resultcode>200</resultcode>
<reason>成功的返回</reason>
<result>
	<area>浙江省溫州市平陽縣</area>
	<sex>男</sex>
	<birthday>1989年03月08日</birthday>
</result>
</root>
可能寫到這裏很多做過聚合數據的朋友都已經知道了,這是聚合數據Juhe.cn提供的API接口,如果你已
經瞭解可以跳過也可以繼續看下去~每一個小的學習分享都是一份進步。


-------------------------------------------代碼實現---------------------------------------------------------------------

當然這裏,聚合API有提供具體Demo,你可以有時間去參考,也可以學習我的,我的代碼更爲細緻並且講解比較細緻,可以參考學習:直接在百度輸入“聚合數據”即可:


這裏有很多免費的API接口提供我們的調用查詢,下面我自己寫了查詢身份證信息查詢、身份證掛失查詢、身份證泄漏查詢的三個接口。完整代碼如下:記得把包名換掉哦~

package com.mo9.utils.juheApi;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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 org.apache.log4j.Logger;


import net.sf.json.JSONObject;
 
/**
*身份證查詢調用示例代碼 - 聚合數據
*在線接口文檔:http://www.juhe.cn/docs/38
**/
 
public class JuheUtils {
	private static Logger logger = Logger.getLogger(JuheUtils.class);
    public static final String DEF_CHATSET = "UTF-8";
    public static final int DEF_CONN_TIMEOUT = 30000;
    public static final int DEF_READ_TIMEOUT = 30000;
    public static String userAgent =  "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36";
 
    //配置您申請的KEY
    public static final String APPKEY ="***********************";
    //身份證號碼
    public static final String IDCARD = "***************";
    //返回數據類型 json/xml 默認json
    public static final String DTYPE = "json";
    public static void main(String[] args) {
    	String result = queryIdcardInfo();
    <span style="white-space:pre">	</span>logger.info("===result==="+result);
	}
 
    //1.身份證信息查詢
    public static String  queryIdcardInfo(){
        String result =null;
        String url ="http://apis.juhe.cn/idcard/index";//請求接口地址
        Map<String,Object> params = new HashMap<String,Object>();//請求參數
            params.put("cardno",IDCARD);//身份證號碼
            params.put("dtype",DTYPE);//返回數據格式:json或xml,默認json
            params.put("key",APPKEY);//你申請的key
 
        try {
            result =net(url, params, "GET");
            JSONObject object = JSONObject.fromObject(result);
            if(object.getInt("error_code")==0){
               logger.info(object.get("result"));
            }else{
               logger.info(object.get("error_code")+":"+object.get("reason"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
 
    //2.身份證泄漏信息查詢
    public static String getQueryIdcardLeakInfo(){
        String result =null;
        String url ="http://apis.juhe.cn/idcard/leak";//請求接口地址
        Map<String,Object> params = new HashMap<String,Object>();//請求參數
        params.put("cardno",IDCARD);//身份證號碼
        params.put("dtype",DTYPE);//返回數據格式:json或xml,默認json
        params.put("key",APPKEY);//你申請的key
 
        try {
            result =net(url, params, "GET");
            JSONObject object = JSONObject.fromObject(result);
            if(object.getInt("error_code")==0){
               logger.info(object.get("result"));
            }else{
               logger.info(object.get("error_code")+":"+object.get("reason"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return result;
    }
 
    //3.身份證掛失信息查詢
    public static String getQueryIdcardLossInfo(){
        String result =null;
        String url ="http://apis.juhe.cn/idcard/loss";//請求接口地址
        Map<String,Object> params = new HashMap<String,Object>();//請求參數
        params.put("cardno",IDCARD);//身份證號碼
        params.put("dtype",DTYPE);//返回數據格式:json或xml,默認json
        params.put("key",APPKEY);//你申請的key
 
        try {
            result =net(url, params, "GET");
            JSONObject object = JSONObject.fromObject(result);
            if(object.getInt("error_code")==0){
               logger.info(object.get("result"));
            }else{
               logger.info(object.get("error_code")+":"+object.get("reason"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
 
 
 
    /**
     *
     * @param strUrl 請求地址
     * @param params 請求參數
     * @param method 請求方法
     * @return  網絡請求字符串
     * @throws Exception
     */
    public static String net(String strUrl, Map<String,Object> params,String method) throws Exception {
        HttpURLConnection conn = null;
        BufferedReader reader = null;
        String rs = null;
        try {
            StringBuffer sb = new StringBuffer();
            if(method==null || method.equals("GET")){
                strUrl = strUrl+"?"+urlencode(params);
            }
            URL url = new URL(strUrl);
            conn = (HttpURLConnection) url.openConnection();
            if(method==null || method.equals("GET")){
                conn.setRequestMethod("GET");
            }else{
                conn.setRequestMethod("POST");
                conn.setDoOutput(true);
            }
            conn.setRequestProperty("User-agent", userAgent);
            conn.setUseCaches(false);
            conn.setConnectTimeout(DEF_CONN_TIMEOUT);
            conn.setReadTimeout(DEF_READ_TIMEOUT);
            conn.setInstanceFollowRedirects(false);
            conn.connect();
            if (params!= null && method.equals("POST")) {
                try {
                    DataOutputStream out = new DataOutputStream(conn.getOutputStream());
                        out.writeBytes(urlencode(params));
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
            InputStream is = conn.getInputStream();
            reader = new BufferedReader(new InputStreamReader(is, DEF_CHATSET));
            String strRead = null;
            while ((strRead = reader.readLine()) != null) {
                sb.append(strRead);
            }
            rs = sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                reader.close();
            }
            if (conn != null) {
                conn.disconnect();
            }
        }
        return rs;
    }
 
    //將map型轉爲請求參數型
    public static String urlencode(Map<String,Object>data) {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry i : data.entrySet()) {
            try {
                sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
}

上面代碼拷貝之後引入相應的jar,我通過maven直接下載的,直接運行結果如下,考慮隱私問題部分已經遮擋不過可以參考說明文檔Json返回數據。XML格式你可以自己更改測試:


這裏我們可以看到查詢返回成功,如果身份證號碼或者格式等輸入參數有誤會有對應的錯誤碼信息。具體可以自己參考聚合數據API文檔。

我現在隨便輸入一個錯誤的身份證號碼,看下查詢結果:

203803:身份證校驗位不正確
===result==={"resultcode":"203","reason":"身份證校驗位不正確","result":{"area":"安徽省合肥市","sex":"男","birthday":"1996年03月10日","verify":"該身份證號校驗位不正確"},"error_code":203803}

既然出現了錯誤碼,就順手把錯誤碼的參考字典貼出來吧~

通過上圖的錯誤碼我們知道是身份證有誤。具體其他細節可以自己摸索~所有功能都已經實現了,具體代碼方面我已經註釋和編碼已經很明確了,大家可以自己參考,不過具體主要部分我還是總結下:

1、APPKEY是需要個人到聚合數據申請的,否則查詢不到。

2、三個查詢接口,不同在於API提供的HTTP接口,有人會問爲什麼不用HTTPS,後續會改爲HTTPS,現在用的MD5加密簽名來保證信息一致性。

3、net方法發送HTTP請求。

4、如果你用心了你會發現這裏的代碼寫法非常漂亮,有效的避免了重構一書所說的冗餘代碼、過長參數、方法命名讓人疑惑等等的問題。比如你看下將map型轉爲請求參數型提煉爲一個方法,後面可以供其他方法調用,小的功能分割出來有利於代碼的管理並且功能清晰,代碼整潔~哦拉拉,今天就到這裏啦~

有什麼問題或者錯誤歡迎指出~



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章