今天在公司的任務是完成定時任務激活老用戶發短息功能上線,其實這個功能在昨天就已經完成了,由於運維同事在發佈的時候漏掉了,導致今天在查看日誌的時候沒有看到 ,有點出乎意料,我的代碼明明很簡潔明瞭功能明確!爲什麼會有這樣的問題?只好查詢版本才發現線上沒有發佈我的最新代碼,好吧~問題找到了,現在有一個兩全的方法,我們的admin系統有一個手動走定時任務的功能,花了幾分鐘添加上去測試OK~下午上線。
工作描述基本結束了,下面是個人今天的技術分享:我們都知道網上有很多頁面可以根據身份證查詢歸屬地、性別、出生日期等;根據手機號碼查詢歸屬地。可是具體它是怎麼實現的呢?作爲一個程序員,知識和經驗是在項目和平時的學習中積累的,下面是一個關於查詢身份證信息的介紹和具體實現代碼:
-------------------------------說明文檔---------------------------------------------
-------------------------------------------代碼實現---------------------------------------------------------------------
當然這裏,聚合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型轉爲請求參數型提煉爲一個方法,後面可以供其他方法調用,小的功能分割出來有利於代碼的管理並且功能清晰,代碼整潔~哦拉拉,今天就到這裏啦~
有什麼問題或者錯誤歡迎指出~