調用google地圖接口 的封裝

示例: html

package com.destination.http;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import net.sf.json.JSONException;
import net.sf.json.JSONObject;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.destination.LocationReq;
import com.sms.http.SmsAuth;
import com.weibo.weibo4j.model.MySSLSocketFactory;

public class DestinationMsg
{
    static Log log = LogFactory.getLog(DestinationMsg.class);
    private static final String authCode = "25192bd58726e1e0dd59efac686e5daeb5273b46";

    /** 設置消息頭、參數
     * 
     * @param message
     *            短息信息
     * @param URL
     *            請求的URL
     * @return 是否成功
     * @exception Exception */
    public JSONObject httpGetRequest(LocationReq message, String URL, String appKey, String token)
    {
        String authorization = "appKey=" + '"' + appKey + '"' + ",token=" + '"' + token + '"';
        // String authorization = "appKey=" + '"' + appKey + '"' + ",token=" + '"' + token + '"';
        JSONObject jsonResult = null;

        Protocol myhttps = new Protocol("https", new MySSLSocketFactory(), 443);
        Protocol.registerProtocol("https", myhttps);

        // 定義http客戶端對象--httpClient
        HttpClient httpClient = new HttpClient();
        // 定義並實例化客戶端連接對象-GetMethod
        GetMethod postMethod = new GetMethod(URL);

        // 設置http的頭
        postMethod.setRequestHeader("Authorization", authorization);
        postMethod.setRequestHeader("Content-Type", "application/json;charset=utf-8");
        postMethod.setRequestHeader("Accept", "application/json");
        jsonResult = httpRequest(httpClient, postMethod);

        return jsonResult;
    }

    /** 根據經緯度反向解析地址,有時須要多嘗試幾回 注意:(摘自:http://code.google.com/intl/zh-CN/apis/maps/faq.html 提交的地址解析請求次數是否有限制?) 若是在 24
     * 小時時段內收到來自一個 IP 地址超過 15,000 個地址解析請求, 或從一個 IP 地址提交的地址解析請求速率過快,Google 地圖 API 編碼器將用 620 狀態代碼開始響應。 若是地址解析器的使用仍然過多,則從該
     * IP 地址對 Google 地圖 API 地址解析器的訪問可能被永久阻止。
     * 
     * @param latitude
     *            緯度
     * @param longitude
     *            經度
     * @return */
    public static String geocodeAddr(String latitude, String longitude)
    {
        String addr = "";

        // 也能夠是http://maps.google.cn/maps/geo?output=csv&key=abcdef&q=%s,%s,不過解析出來的是英文地址
        // 密鑰能夠隨便寫一個key=abc
        // output=csv,也能夠是xml或json,不過使用csv返回的數據最簡潔方便解析
        String url = String.format("http://ditu.google.cn/maps/geo?output=csv&key=abcdef&q=%s,%s", latitude, longitude);
        URL myURL = null;
        URLConnection httpsConn = null;
        try
        {
            myURL = new URL(url);
        }
        catch (MalformedURLException e)
        {
            log.error("請求URL地址失敗!", e);
            return null;
        }
        try
        {
            httpsConn = (URLConnection) myURL.openConnection();
            if (httpsConn != null)
            {
                InputStreamReader insr = new InputStreamReader(httpsConn.getInputStream(), "UTF-8");
                BufferedReader br = new BufferedReader(insr);
                String data = null;
                if ((data = br.readLine()) != null)
                {
                    System.out.println(data);
                    String[] retList = data.split(",");
                    if (retList.length > 2 && ("200".equals(retList[0])))
                    {
                        addr = retList[2];
                        addr = addr.replace("\"", "");
                    }
                    else
                    {
                        addr = "";
                    }
                }
                insr.close();
            }
        }
        catch (IOException e)
        {
            log.error("獲取請求響應結果失敗!", e);
            return null;
        }
        return addr;

    }

    /** 請求發送
     * 
     * @param HttpClient
     * @param PostMethod
     * @param JSONObject
     * @return 是否成功
     * @exception Exception */
    public JSONObject httpRequest(HttpClient httpClient, GetMethod postMethod)
    {
        // 解析響應結果
        JSONObject jsonResult = new JSONObject();
        // 響應內容
        String result = "";
        try
        {
            log.info("httpClient編碼格式:----------->" + postMethod.getRequestCharSet());
            // 定義訪問地址的連接狀態
            int statusCode = 0;
            try
            {
                // 客戶端請求url數據
                statusCode = httpClient.executeMethod(postMethod);
            }
            catch (Exception e)
            {
                log.error("請求URL失敗!", e);
                return jsonResult;
            }

            // 請求成功狀態-200
            if (statusCode == HttpStatus.SC_OK)
            {
                try
                {
                    // 獲取請求響應結果
                    result = postMethod.getResponseBodyAsString();
                    log.info("result----------->" + result);
                }
                catch (IOException e)
                {
                    log.error("獲取請求響應結果失敗!", e);
                    return jsonResult;
                }
            }
            else
            {
                log.error("訪問地址請求失敗!:" + statusCode);
                return jsonResult;
            }
        }
        catch (Exception e)
        {
            log.error(e.getMessage(), e);
            return jsonResult;
        }
        finally
        {
            // 釋放連接
            postMethod.releaseConnection();
            httpClient.getHttpConnectionManager().closeIdleConnections(0);
        }

        try
        {
            jsonResult = JSONObject.fromObject(result);
        }
        catch (JSONException e)
        {
            log.error("獲取的Http響應結果格式錯誤!", e);

        }

        return jsonResult;
    }
}
相關文章
相關標籤/搜索