鉴于最近项目涉及到查询归属地的问题,今天在此做一下技术分享,如果有更好的建议,还请读者大神指出。
回归正题,关于手机号码归属地,想要查询的无非是运行商、省份、市之类的信息,那么就会涉及到Http请求以及相关的第三方查询接口。好的,下面就开始讲重点了。
首先,你得有一个请求地址也就是第三方的接口地址,否则,鬼知道你要往哪边跑。目前,大部分的第三方接口都差不多,例如:http://apis.juhe.cn/mobile/get。问题在于后面需要传入的手机号、申请到的关键钥匙KEY以及数据类型。当然,数据类型这块可以先不考虑,关键钥匙KEY需要自己去申请,这点很重要,没有钥匙去开毛线锁。
还有一个,就是userAgent,这东西百度百科给出的解释是用户代理,其实无非是让服务器去识别用户的操作系统以及版本,浏览器引擎相关之类的信息,这个也比较重要,否则容易出现页面不能正常显示。Http请求就比较简单了,变动不是很大。
public static String net(String strUrl, Map<String,String> map,String method) throws Exception {
HttpURLConnection conn = null;
BufferedReader reader = null;
String rs = null;
try {
StringBuffer sb = new StringBuffer();
if((method==null || method.equals("GET")) && map!=null){
strUrl = strUrl+"?"+UrlEncode(map);
}
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 (map!= null && method.equals("POST")) {
try {
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.writeBytes(UrlEncode(map));
} catch (Exception e) {
e.printStackTrace();
}
}
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;
}
接下来的事情就比较重点了,上面的方法是时候要起作用了。定义一个变量去接收net()方法返回的结果,然后转为json格式的数据。map存储传入数据键值对,然后通过json格式获取相应的数据。
try {
result =net(url, map, "GET");
JSONObject object = JSONObject.fromObject(result);
if(object.getInt("resultcode")==200){
JSONObject jsonObject=object.getJSONObject("result");
return jsonObject.getString("province")+"-"+jsonObject.getString("city");
}else{
return object.get("resultcode")+":"+object.get("reason");
}
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
总结下来,用的东西不多,不过有些东西需要考虑清楚,很简单的一个案例,希望可以对需要的人有些帮助。