1. 程式人生 > >Java專案開發心得(一):利用Java技術實現查詢手機號碼歸屬地

Java專案開發心得(一):利用Java技術實現查詢手機號碼歸屬地

      鑑於最近專案涉及到查詢歸屬地的問題,今天在此做一下技術分享,如果有更好的建議,還請讀者大神指出。

      迴歸正題,關於手機號碼歸屬地,想要查詢的無非是執行商、省份、市之類的資訊,那麼就會涉及到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();
        }

    總結下來,用的東西不多,不過有些東西需要考慮清楚,很簡單的一個案例,希望可以對需要的人有些幫助。