1. 程式人生 > >基於Restful服務端的客戶端實現(WebClient 和 HttpURLConnection)

基於Restful服務端的客戶端實現(WebClient 和 HttpURLConnection)

前提:

1、Restful風格的WS服務端:Web Service筆記(五):CXF開發RESTful風格的Web Service

2、訪問客戶端的技術太多了,這邊總結下本人使用過的,主要是四種:WebClient 、HttpURLConnection、HttpClient 和RestTemplate

3、服務端程式碼實現為 Web Service筆記(五):CXF開發RESTful風格的Web Service 中的sendXml()方法,訪問地址與客戶端傳輸的xml檔案分別為:
[java] view plain copy

// 傳送的報文  
String mRequestXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><USER><AGE>27</AGE><NAME>SAM-SHO</NAME><PhoneList><UserPhone><num>13612345678</num><type>移動</type></UserPhone><UserPhone><num>13798765432</num><type>聯通</type></UserPhone></PhoneList><UserAddress><homeAddress>蘇州高新區</homeAddress><workAddress>蘇州園區</workAddress></UserAddress></USER>";  

// 服務端地址  
String mUrl = "http://localhost:8080/Java_WS_Server/rest/surpolicy/sendXml";  

一、WebClient

(一)WebClient 客戶端

1、WebClient 是CXF自帶的客戶端實現,比較簡單實用。

2、客戶端程式碼如下:

[java] view plain copy

/** 
 * WebClient 的客戶端訪問 
 */  
private void WebClientVisit() {  
    // 手動建立webClient物件,注意這裡的地址是釋出的那個/rest地址  
    // String url = "http://localhost:8080/Java_WS_Server/rest/";  
    // WebClient client = WebClient.create(url);  

    // 從Spring Ioc容器中拿webClient物件,或者直接用注入  
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-client.xml");  
    WebClient client = ctx.getBean("webClient", WebClient.class);  

    // 設定超時  
    ClientConfiguration config = WebClient.getConfig(client);  
    config.getHttpConduit().getClient().setReceiveTimeout(90000);  

    String tResponseMsg = client.path("surpolicy/sendXml").accept(MediaType.APPLICATION_XML).post(mRequestXml, String.class);  
    System.out.println("返回的資訊: \r\n" + tResponseMsg);  

}  

(二)WebClient 詳解

1、WebClient.create(String url):訪問地址。

2、path(String url,Object parames):地址 和 引數 。

3、accept(String… types):接收的型別。

4、get/post(Object body, Class responseClass):傳送的內容 和 返回的型別。

5、設定超時(固定用法):

[java] view plain copy

ClientConfiguration config = WebClient.getConfig(client);  
config.getHttpConduit().getClient().setReceiveTimeout(90000);//設定超時  

(三)WebClient 工具類封裝

[java] view plain copy

package cn.rest.util;  

import java.io.IOException;  
import java.io.StringWriter;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.Map;  
import java.util.Set;  

import javax.ws.rs.core.Response;  

import org.apache.cxf.jaxrs.client.ClientConfiguration;  
import org.apache.cxf.jaxrs.client.WebClient;  
import org.apache.cxf.jaxrs.ext.form.Form;  
import org.apache.http.HttpResponse;  
import org.apache.http.ParseException;  
import org.apache.http.client.entity.UrlEncodedFormEntity;  
import org.apache.http.client.methods.HttpPost;  
import org.apache.http.impl.client.DefaultHttpClient;  
import org.apache.http.message.BasicNameValuePair;  
import org.apache.log4j.Logger;  

import freemarker.cache.StringTemplateLoader;  
import freemarker.template.Configuration;  
import freemarker.template.Template;  
import freemarker.template.TemplateException;  

/** 
 *  
 *<p>Description : 客戶端傳送請求共通方法</p> 
 *<p>Date        : May 3, 2013</p> 
 *<p>Remark      : </p> 
 * @version 
 */  
public class HttpClient {  

    private static Logger logger  = Logger.getLogger(HttpClient.class);  

    public final static String ESB_REQUEST_ID = "TP-REQUEST-ID";  
    public final static String ESB_SERVICE_ID = "TP-SERVICE-ID";  
    public final static String ESB_APP_ID = "TP-APP-ID";  
    public final static String ESB_ACCESS_TOKEN = "TP-ACCESS-TOKEN";  
    public final static String ESB_REQUEST_TIME = "TP-REQUEST-TIME";  
    public final static String ESB_REQUEST_HASH = "TP-REQUEST-HASH";  
    public final static String ESB_REQUEST_EXT = "TP-REQUEST-EXT";  

    private static final String ENCODING = "UTF-8";  

    /** 
     * json 
     */  
    private static final String APPLICATION_JSON = "application/json";  

    /** 
     * xml 
     */  
    private static final String APPLICATION_XML = "text/xml";  
    /** 
     * form 
     */  
    private static final String APPLICATION_FORM = "application/x-www-form-urlencoded";  

    private static final long defaultReciveTimeout = 60000;  
    private static long reciveTimeout;  

    /** 
     * 設定HttpClient超時時間 
     *  
     * 注意:因為是靜態變數所以修改此處,會影響整個應用程式的超時。 
     *       如果不想影響到其他處呼叫的超時,在每次呼叫請求方法後, 
     *       需要再次呼叫 setDefaultTimeout(),恢復成預設設定。 
     *  
     * @param timeout 
     */  
    public static void setReciveTimeout(long timeout) {  
        reciveTimeout = timeout;  
    }  

    public static void setDefaultTimeout() {  
        reciveTimeout = defaultReciveTimeout;  
        System.out.println("HttpClient default reciveTimeout is: " + reciveTimeout);  
    }  

    private static WebClient createClient(String url, List<Object> providers) {  
        WebClient client;  
        if (providers != null && providers.size() > 0) {  
            client = WebClient.create(url, providers);  
        } else {  
            client = WebClient.create(url);  
        }  
        ClientConfiguration config = WebClient.getConfig(client);  
        config.getHttpConduit().getClient().setReceiveTimeout(reciveTimeout);  
        return client;  
    }  

    private static WebClient createClient(String url) {  
        return createClient(url, null);  
    }  

    /** 
     * post Json 
     *  
     * @param url 
     *            請求地址 
     * @param o 
     *            POJO物件 
     * @return 返回伺服器響應 
     * @throws TpException 
     *           
     */  
    public static Object postJson(String url, Object o) {  
        List<Object> providers = new ArrayList<Object>();  
        // 配置json轉換器  
        providers.add(new org.codehaus.jackson.jaxrs.JacksonJsonProvider());  
        // 建立Webclient物件  
        WebClient client = createClient(url, providers);  
        // 傳送請求,伺服器返回響應  
        Object res = client.accept(APPLICATION_JSON).type(APPLICATION_JSON)  
                .post(o, o.getClass());  
        return res;  
    }  

    /** 
     * post Xml 
     *  
     * @param url 
     *            請求地址 
     * @param o 
     *            POJO物件 
     * @return 返回伺服器響應 
     */  
    public static Response postXML(String url, Object o) {  
        // 建立建立Web client物件  
        WebClient client = createClient(url);         
        // 傳送請求,伺服器返回響應  
        Response res = client.accept(APPLICATION_XML).type(APPLICATION_XML)  
                .post(o);  
        return res;  
    }  

    /** 
     * post Xml with additional headers 
     *  
     * @param url 
     *            請求地址 
     * @param o 
     *            POJO物件 
     * @return 返回伺服器響應 
     */  
    public static Response postXML(String url, Object o, Map<String, String> addHeaders) {  
        // 建立建立Web client物件  
        WebClient client = createClient(url);  
        addHeaders(client, addHeaders);  
        // 傳送請求,伺服器返回響應  
        Response res = client.accept(APPLICATION_XML).type(APPLICATION_XML)  
                .post(o);  
        return res;  
    }  

    /** 
     * post object to xml 
     *  
     * @param url 
     *            請求地址 
     * @param o 
     *            POJO物件 
     * @return 返回伺服器響應 
     */  
    public static Object postXML(String url, Object o, Class<?> clazz){  
        // 建立建立Web client物件  
        WebClient client = createClient(url);  
        // 傳送請求,伺服器返回響應  
        Object res = client.accept(APPLICATION_XML).type(APPLICATION_XML)  
                .post(o, clazz);  
        return res;  
    }  

    public static Object postXML(String url, Object o, Class<?> clazz, Map<String, String> addHeaders){  
        // 建立建立Web client物件  
        WebClient client = createClient(url);  
        addHeaders(client, addHeaders);  
        // 傳送請求,伺服器返回響應  
        Object res = client.accept(APPLICATION_XML).type(APPLICATION_XML)  
                .post(o, clazz);  
        return res;  
    }  

    /** 
     * get xml 
     * @param url 
     *            請求地址 
     * @param o 
     *            POJO物件 
     * @return 返回伺服器響應 
     */  
    public static Object getXML(String url, Object o) {  
        // 建立建立Web client物件  
        WebClient client = createClient(url);  
        // 傳送請求,伺服器返回響應  
        Object obj = client.accept(APPLICATION_XML).type(APPLICATION_XML)  
                .get(o.getClass());  
        return obj;  
    }  

    public static Object getXML(String url, Object o, Map<String, String> addHeaders) {  
        // 建立建立Web client物件  
        WebClient client = createClient(url);  
        addHeaders(client, addHeaders);  
        // 傳送請求,伺服器返回響應  
        Object obj = client.accept(APPLICATION_XML).type(APPLICATION_XML)  
                .get(o.getClass());  
        return obj;  
    }  

    /** 
     * get json 
     *  
     * @param url 
     *            請求地址 
     * @param o 
     *            POJO物件 
     * @return 返回伺服器響應 
     */  
    public static Object getJson(String url, Object o) {  
        // 建立建立Web client物件  
        WebClient client = createClient(url);  
        // 傳送請求,伺服器返回響應  
        Object obj = client.accept(APPLICATION_JSON).type(APPLICATION_JSON)  
                .get(o.getClass());  
        return obj;  
    }  

    public static Object getJson(String url, Object o, Map<String, String> addHeaders) {  
        // 建立建立Web client物件  
        WebClient client = createClient(url);  
        addHeaders(client, addHeaders);  
        // 傳送請求,伺服器返回響應  
        Object obj = client.accept(APPLICATION_JSON).type(APPLICATION_JSON)  
                .get(o.getClass());  
        return obj;  
    }  

    /** 
     * post XML過載,返回Response資訊 
     *  
     * @param url 
     *            請求地址 
     * @param o 
     *            實體類物件 
     * @param xmlStr 
     *            xml字串 
     * @return 返回伺服器響應資訊 
     * @throws IOException 
     *            異常 
     * @throws TemplateException 
     *            異常 
     */  
    public static Response postXML(String url, Object o, String xmlStr){  
        String toPostXML = writeXML(o, xmlStr);  
        // 建立建立Web client物件  
        WebClient client = createClient(url);  
        // 傳送請求,返回響應資訊  
        Response res = client.post(toPostXML);  
        return res;  
    }  

    public static Response postFormRequest(String url, Map<String, String> formValues, Map<String, String> addHeaders) {  
        WebClient client = createClient(url);  
        Form form = new Form();  
        addHeaders(client, addHeaders);  
        Set<String> keys = formValues.keySet();  
        for(String key : keys) {  
            form.set(key, formValues.get(key));  
        }  
        return client.form(form);  
    }  

    /** 
     * POST FORM表單 
     * @param <T> 返回型別(String.class, xxx.class等) 
     * @param url 請求url 
     * @param formValues 表單資料(Map) 
     * @param addHeaders 表頭資料(Map) 
     * @param clazz 返回型別(String.class, xxx.class等) 
     * @return 返回指定型別的物件 
     */  
    public static <T> T postForm(String url, Map<String, String> formValues, Map<String, String> addHeaders, Class clazz) {  
        Response res = postFormRequest(url, formValues, addHeaders);  
        return (T)res.readEntity(clazz);  
    }  

    /** 
     * POST FORM表單 
     * @param <T> 
     * @param url 請求url 
     * @param formValues 表單資料(Map) 
     * @param clazz 返回型別(String.class, xxx.class等) 
     * @return 
     */  
    public static <T> T postForm(String url, Map<String, String> formValues, Class clazz) {  
        Response res = postFormRequest(url, formValues, null);  
        return (T)res.readEntity(clazz);  
    }  

    private static void addHeaders(WebClient client, Map<String, String> addHeaders) {  
        if (addHeaders != null) {  
            Set<String> keys = addHeaders.keySet();  
            for(String key : keys) {  
                client.header(key, addHeaders.get(key));  
            }  
        }  
    }  


    /** 
     * 伺服器請求 
     *  
     * @param url 
     *         請求路徑 
     * @param posMap 
     *           map物件 
     * @return 伺服器響應資訊 
     * @throws Exception  
     * @throws ParseException  
     */  
    public static HttpResponse postXMl(String url,Map<String,String> posMap) throws ParseException, Exception{  
        // 建立HttpClient  
        DefaultHttpClient client = new DefaultHttpClient();  
        List<BasicNameValuePair> namePairs = new ArrayList<BasicNameValuePair>();  
        HttpPost httppost = new HttpPost(url);  
        // Map引數轉化為鍵值對  
        for (Map.Entry<String, String> entry : posMap.entrySet()) {  
            BasicNameValuePair pair = new BasicNameValuePair(entry.getKey(), entry.getValue());  
            namePairs.add(pair);  
        }  
        //   
        httppost.setEntity(new UrlEncodedFormEntity(namePairs,"UTF-8"));  

        // 傳送請求  
        HttpResponse res =  client.execute(httppost);  
        return res;  
    }  

    /** 
     * 將物件值寫入XML模板中 
     *  
     * @param o 
     *            實體類物件 
     * @param xmlStr 
     *            模板xml字串 
     * @return 返回xml字串 
     * @throws IOException 
     *            異常 
     * @throws TemplateException 
     *            異常 
     */  
    public static String writeXML(Object o, String xmlStr) {  
        // 建立Configuration物件  
        Configuration cfg = new Configuration();  
        // 建立StringTemplateLoader物件  
        StringTemplateLoader stringLoader = new StringTemplateLoader();  
        // 傳入的xml字串  
        stringLoader.putTemplate("xmlTemplate", xmlStr);  
        // 設定模板  
        cfg.setTemplateLoader(stringLoader);  
        // 建立StringWriter物件  
        StringWriter out = new StringWriter();  
        // 獲取字串模板  
        try {  
            Template template = cfg.getTemplate("xmlTemplate");  
            // 物件值寫入xml模板  
            template.process(o, out);  
        } catch (IOException e) {  
            logger.error(HttpClient.class, e);  
            e.printStackTrace();  
        } catch (TemplateException e) {  
            logger.error(HttpClient.class, e);  
            e.printStackTrace();  
        } finally {  
            try {  
                out.close();  
            } catch (IOException e) {  
                logger.error(HttpClient.class, e);  
                e.printStackTrace();  
            }  
        }  
        return out.toString();  
    }  

}  

二、HttpURLConnection

(一)HttpURLConnection客戶端

1、java自帶的api,位於net包下,使用較為繁瑣,基本功能齊全。

2、客戶端程式碼如下:

[java] view plain copy

/** 
 * HttpURLConnection 的客戶端訪問 
 */  
private void connectionClientVisit() {  

    // 定義輸入輸出引數  
    String returnXml = ""; // 核心返回結果報文字串  
    String strMessage = "";  

    // 傳送報文  
    BufferedReader reader = null;  
    StringBuffer buffer = new StringBuffer();  

    // System.setProperty("http.proxyHost","10.7.9.8");//設定代理  
    // System.setProperty("http.proxyPort","54367");  

    try {  

        URL sendUrl = new URL(mUrl);  
        HttpURLConnection conn = (HttpURLConnection) sendUrl.openConnection();  

        conn.setRequestMethod("POST");// 設定請求方式  
        conn.setConnectTimeout(5000); // 設定連線超時為5秒  
        conn.setDoOutput(true);// 設定是否向connection輸出,因為這個是post請求,引數要放在  
        // http正文內,因此需要設為true  
        conn.setDoInput(true);// Read from the connection. Default is true.  
        conn.setAllowUserInteraction(true);  
        conn.setUseCaches(false); // Post 請求不能使用快取  
        conn.setRequestProperty("Content-Language", "GBK");  
        conn.setRequestProperty("Content-Type", "text/xml");// 設定header資訊,這個必不可少  

        // 連線,從sendUrl.openConnection()至此的配置必須要在 connect 之前完成,  
        // 要注意的是 conn.getOutputStream 會隱含的進行 connect。  
        // conn.connect();//連線,可以省略  
        OutputStream stream = conn.getOutputStream();  

        stream.write(mRequestXml.getBytes());  
        stream.flush();  
        stream.close();  
        // 獲取返回的資料  
        // 無論是post還是get,http請求實際上直到HttpURLConnection.getInputStream()這個函式裡面才正式傳送出去。  
        InputStream inputStream = conn.getInputStream();  
        reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));  
        while ((strMessage = reader.readLine()) != null) {  
            buffer.append(strMessage);  
        }  
        returnXml = buffer.toString();  

        System.out.println("HttpURLConnection 的客戶端接收返回值: \r\n" + returnXml);  

        reader.close();  
        conn.disconnect();  
    } catch (MalformedURLException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
}  

(二)HttpURLConnection 詳解:注意傳送的時機

1、Get方式的訪問:

[java] view plain copy

/** 
 * Get方式 
 * @throws IOException 
 */  
public static void readContentFromGet() throws IOException {  
    // 拼湊get請求的URL字串,使用URLEncoder.encode對特殊和不可見字元進行編碼  
    String getURL = GET_URL + "?username=" + URLEncoder.encode("你好", "utf-8");  
    URL getUrl = new URL(getURL);  
    // 根據拼湊的URL,開啟連線,URL.openConnection函式會根據URL的型別,  
    // 返回不同的URLConnection子類的物件,這裡URL是一個http,因此實際返回的是HttpURLConnection  
    HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();  
    // 進行連線,但是實際上get request要在下一句的connection.getInputStream()函式中才會真正發到伺服器  
    connection.connect();  
    // 取得輸入流,並使用Reader讀取  
    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));  
    System.out.println("=============================");  
    System.out.println("Contents of get request");  
    System.out.println("=============================");  
    String lines;  
    while ((lines = reader.readLine()) != null) {  
        System.out.println(lines);  
    }  
    reader.close();  
    // 斷開連線  
    connection.disconnect();  
    System.out.println("=============================");  
    System.out.println("Contents of get request ends");  
    System.out.println("=============================");  
}  

2、Post方式的訪問:

[java] view plain copy

/** 
 * Post 方式 
 * @throws IOException 
 */  
public static void readContentFromPost() throws IOException {  
    // Post請求的url,與get不同的是不需要帶引數  
    URL postUrl = new URL(POST_URL);  
    // 開啟連線  
    HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();  
    // Output to the connection. Default is  
    // false, set to true because post  
    // method must write something to the  
    // connection  
    // 設定是否向connection輸出,因為這個是post請求,引數要放在  
    // http正文內,因此需要設為true  
    connection.setDoOutput(true);  
    // Read from the connection. Default is true.  
    connection.setDoInput(true);  
    // Set the post method. Default is GET  
    connection.setRequestMethod("POST");  
    // Post cannot use caches  
    // Post 請求不能使用快取  
    connection.setUseCaches(false);  
    // This method takes effects to  
    // every instances of this class.  
    // URLConnection.setFollowRedirects是static函式,作用於所有的URLConnection物件。  
    // connection.setFollowRedirects(true);  

    // This methods only  
    // takes effacts to this  
    // instance.  
    // URLConnection.setInstanceFollowRedirects是成員函式,僅作用於當前函式  
    connection.setInstanceFollowRedirects(true);  
    // Set the content type to urlencoded,  
    // because we will write  
    // some URL-encoded content to the  
    // connection. Settings above must be set before connect!  
    // 配置本次連線的Content-type,配置為application/x-www-form-urlencoded的  
    // 意思是正文是urlencoded編碼過的form引數,下面我們可以看到我們對正文內容使用URLEncoder.encode  
    // 進行編碼  
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");  
    // 連線,從postUrl.openConnection()至此的配置必須要在connect之前完成,  
    // 要注意的是connection.getOutputStream會隱含的進行connect。  
    connection.connect();  
    DataOutputStream out = new DataOutputStream(connection.getOutputStream());  
    // The URL-encoded contend  
    // 正文,正文內容其實跟get的URL中'?'後的引數字串一致  
    String content = "firstname=" + URLEncoder.encode("一個大肥人", "utf-8");  
    // DataOutputStream.writeBytes將字串中的16位的unicode字元以8位的字元形式寫道流裡面  
    out.writeBytes(content);  

    out.flush();  
    out.close(); // flush and close  
    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));  
    String line;  
    System.out.println("=============================");  
    System.out.println("Contents of post request");  
    System.out.println("=============================");  
    while ((line = reader.readLine()) != null) {  
        System.out.println(line);  
    }  
    System.out.println("=============================");  
    System.out.println("Contents of post request ends");  
    System.out.println("=============================");  
    reader.close();  
    connection.disconnect();  
}  

3、利用setChunkedStreamingMode 改變傳送的時機

[java] view plain copy

/** 
 * 利用setChunkedStreamingMode 改變傳送的時機 
 * @throws IOException 
 */  
public static void readContentFromChunkedPost() throws IOException {  
    URL postUrl = new URL(POST_URL);  
    HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();  
    connection.setDoOutput(true);  
    connection.setDoInput(true);  
    connection.setRequestMethod("POST");  
    connection.setUseCaches(false);  
    connection.setInstanceFollowRedirects(true);  
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");  
    /**//* 
         * 與readContentFromPost()最大的不同,設定了塊大小為5位元組 
         */  
    connection.setChunkedStreamingMode(5);  
    connection.connect();  
    /**//* 
         * 注意,下面的getOutputStream函式工作方式於在readContentFromPost()裡面的不同 
         * 在readContentFromPost()裡面該函式仍在準備http request,沒有向伺服器傳送任何資料 
         * 而在這裡由於設定了ChunkedStreamingMode,getOutputStream函式會根據connect之前的配置 
         * 生成http request頭,先發送到伺服器。 
         */  
    DataOutputStream out = new DataOutputStream(connection.getOutputStream());  
    String content = "firstname="  
            + URLEncoder.encode("一個大肥人                                                                               " + "                                          "  
                    + "asdfasfdasfasdfaasdfasdfasdfdasfs", "utf-8");  
    out.writeBytes(content);  

    out.flush();  
    out.close(); // 到此時伺服器已經收到了完整的http  
                    // request了,而在readContentFromPost()函式裡,要等到下一句伺服器才能收到http請求。  
    BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));  

    out.flush();  
    out.close(); // flush and close  
    String line;  
    System.out.println("=============================");  
    System.out.println("Contents of post request");  
    System.out.println("=============================");  
    while ((line = reader.readLine()) != null) {  
        System.out.println(line);  
    }  
    System.out.println("=============================");  
    System.out.println("Contents of post request ends");  
    System.out.println("=============================");  
    reader.close();  
    connection.disconnect();  
}  

(三)HttpURLConnection 工具類封裝
[java] view plain copy

package cn.rest.util;  

import java.io.BufferedReader;  
import java.io.ByteArrayOutputStream;  
import java.io.DataInputStream;  
import java.io.DataOutputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.io.ObjectOutputStream;  
import java.io.OutputStream;  
import java.net.URL;  
import java.net.URLConnection;  
import java.net.URLEncoder;  
import java.util.HashMap;  
import java.util.Map;  

public class OtherHttpClient {  

    private Map<String, String> parameters = new HashMap<String, String>();  
    private String url;  
    private String service;  
    private String sendEncode = "UTF-8";  
    private String receiceEncode = "UTF-8";  

    public void addParameter(String name, String value) {  
        this.parameters.put(name, value);  
    }  

    /** 
     * 設定代理 
     *  
     * @param host 
     * @param port 
     */  
    public void setProxy(String host, String port) {  
        System.getProperties().put("proxySet", "true");  
        System.getProperties().setProperty("http.proxyHost", host);  
        System.getProperties().setProperty("http.proxyPort", port);  
    }  

    /** 
     * Post 方法 
     *  
     * @return 
     * @throws Exception 
     */  
    public String post() throws Exception {  
        String response = "";  
        try {  
            response = send();  
        } catch (Exception e) {  
            e.printStackTrace();  
            throw new Exception("PostFailure,Url:" + this.url, e);  
        }  
        return response;  
    }  

    /** 
     * Get 方法 
     *  
     * @param httpUrl 
     * @param encode 
     * @return 
     * @throws Exception 
     */  
    public String get(String httpUrl, String encode) throws Exception {  
        String html = "";  
        try {  
            System.out.println("Http Access Url:" + httpUrl);  
            URL url = new URL(httpUrl);  
            URLConnection c = url.openConnection();  
            InputStream inputs = c.getInputStream();  
            int all = inputs.available();  
            byte[] b = new byte[all];  
            inputs.read(b);  
            html = new String(b, encode);  
            inputs.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
            throw new Exception("getFailure,Url:" + httpUrl);  
        }  

        String returnContent = html.toString();  
        System.out.println("Url return:\n" + returnContent);  
        return returnContent;  
    }  

    private String send() throws Exception {  
        URLConnection con;  
        URL url;  
        String response;  
        String paramStr = "";  
        Object[] services = this.parameters.keySet().toArray();  
        StringBuffer rspContent = null;  
        BufferedReader reader = null;  
        DataInputStream in = null;  

        for (int i = 0; i < services.length; ++i) {  
            if (i == 0)  
                paramStr = paramStr + services[i] + "=" + URLEncoder.encode(this.parameters.get(services[i]).toString(), getSendEncode());  
            else  
                paramStr = paramStr + "&" + services[i] + "=" + URLEncoder.encode(this.parameters.get(services[i]).toString(), getSendEncode());  
        }  
        try {  
            String aLine;  
            url = new URL(getUrl());  
            con = url.openConnection();  
            con.setUseCaches(false);  
            con.setDoOutput(true);  
            con.setDoInput(true);  
            con.setRequestProperty("Content-type", "application/x-www-form-urlencoded");  
            byte[] sendParamByte = paramStr.toString().getBytes("iso8859_1");  
            con.setRequestProperty("Content-length", String.valueOf(sendParamByte.length));  
            DataOutputStream dataOut = new DataOutputStream(con.getOutputStream());  
            dataOut.write(sendParamByte);  
            dataOut.flush();  
            dataOut.close();  
            rspContent = new StringBuffer();  
            in = new DataInputStream(con.getInputStream());  
            reader = new BufferedReader(new InputStreamReader(in, getReceiceEncode()));  

            while ((aLine = reader.readLine()) != null) {  
                rspContent.append(aLine + "\n");  
            }  
            response = rspContent.toString();  
            in.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
            throw new Exception(e);  
        } finally {  
            if (reader != null)  
                reader.close();  
            if (in != null)  
                in.close();  
        }  
        return response;  
    }  

    public String sendStream(String content) throws Exception {  
        URLConnection con;  
        URL url;  
        String response;  
        String paramStr = URLEncoder.encode(content, getSendEncode());  
        StringBuffer rspContent = null;  
        BufferedReader reader = null;  
        DataInputStream in = null;  
        try {  
            String aLine;  
            url = new URL(getUrl());  
            con = url.openConnection();  
            con.setUseCaches(false);  
            con.setDoOutput(true);  
            con.setDoInput(true);  
            con.setRequestProperty("Content-type", "application/x-www-form-urlencoded");  
            byte[] sendParamByte = paramStr.toString().getBytes("iso8859_1");  
            con.setRequestProperty("Content-length", String.valueOf(sendParamByte.length));  
            con.setRequestProperty("Keep-alive", "false");  

            DataOutputStream dataOut = new DataOutputStream(con.getOutputStream());  
            dataOut.write(sendParamByte);  
            dataOut.flush();  
            dataOut.close();  
            rspContent = new StringBuffer();  
            in = new DataInputStream(con.getInputStream());  
            reader = new BufferedReader(new InputStreamReader(in, getReceiceEncode()));  

            while ((aLine = reader.readLine()) != null) {  
                rspContent.append(aLine + "\n");  
            }  
            response = rspContent.toString();  
            in.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
            throw new Exception(e);  
        } finally {  
            if (reader != null)  
                reader.close();  
            if (in != null)  
                in.close();  
        }  
        return response;  
    }  

    public String sendObjStream(Object content) throws Exception {  
        URLConnection con;  
        URL url;  
        String response;  
        StringBuffer rspContent = null;  
        BufferedReader reader = null;  
        DataInputStream in = null;  
        try {  
            String aLine;  
            url = new URL(getUrl());  
            con = url.openConnection();  
            con.setUseCaches(false);  
            con.setDoOutput(true);  
            con.setDoInput(true);  

            ObjectOutputStream dataOut = new ObjectOutputStream(con.getOutputStream());  
            dataOut.writeObject(content);  

            dataOut.flush();  
            dataOut.close();  
            rspContent = new StringBuffer();  
            in = new DataInputStream(con.getInputStream());  
            reader = new BufferedReader(new InputStreamReader(in, getReceiceEncode()));  

            while ((aLine = reader.readLine()) != null) {  
                rspContent.append(aLine + "\n");  
            }  
            response = rspContent.toString();  
            in.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
            throw new Exception(e);  
        } finally {  
            if (reader != null)  
                reader.close();  
            if (in != null)  
                in.close();  
        }  
        return response;  
    }  

    public void persistentPDF(String conurl, String fileName) throws IOException {  
        String paramStr = "";  
        Object[] services = this.parameters.keySet().toArray();  
        DataInputStream in = null;  
        try {  
            for (int i = 0; i < services.length; ++i) {  
                if (i == 0)  
                    paramStr = paramStr + services[i] + "=" + URLEncoder.encode(this.parameters.get(services[i]).toString(), getSendEncode());  
                else {  
                    paramStr = paramStr + "&" + services[i] + "=" + URLEncoder.encode(this.parameters.get(services[i]).toString(), getSendEncode());  
                }  
            }  

            /* 
             * LogTool.debug(super.getClass(), "\nServiceName:" + this.service + 
             * "\n" + "Request URL:" + conurl); 
             */  

            URL url = new URL(conurl);  
            URLConnection con = url.openConnection();  
            con.setUseCaches(false);  
            con.setDoOutput(true);  
            con.setDoInput(true);  
            con.setRequestProperty("Content-type", "application/x-www-form-urlencoded");  
            byte[] sendParamByte = paramStr.toString().getBytes("ISO8859-1");  
            con.setRequestProperty("Content-length", String.valueOf(sendParamByte.length));  
            DataOutputStream dataOut = new DataOutputStream(con.getOutputStream());  
            dataOut.write(sendParamByte);  
            dataOut.flush();  
            dataOut.close();  
            in = new DataInputStream(con.getInputStream());  
            if (in == null)  
                return;  
            OutputStream outPDFStream = new FileOutputStream(fileName);  
            int readSize = 0;  
            int blockSize = 15360;  
            byte[] buffer = new byte[blockSize];  
            while ((readSize = in.read(buffer, 0, buffer.length)) > 0) {  
                outPDFStream.write(buffer, 0, readSize);  
            }  
            label384: outPDFStream.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            if (in != null)  
                in.close();  
        }  
    }  

    public byte[] read(InputStream is) {  
        ByteArrayOutputStream bytestream = new ByteArrayOutputStream();  
        int ch;  
        byte imgdata[] = null;  
        try {  
            while ((ch = is.read()) != -1) {  
                bytestream.write(ch);  
            }  
            imgdata = bytestream.toByteArray();  
            bytestream.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return imgdata;  
    }  

    public String getSendEncode() {  
        return this.sendEncode;  
    }  

    public void setSendEncode(String sendEncode) {  
        this.sendEncode = sendEncode;  
    }  

    public String getReceiceEncode() {  
        return this.receiceEncode;  
    }  

    public void setReceiceEncode(String receiceEncode) {  
        this.receiceEncode = receiceEncode;  
    }  



    public String getUrl() {  
        return this.url;  
    }  

    public void setUrl(String url) {  
        this.url = url;  
    }  

    public Map getParameters() {  
        return this.parameters;  
    }  

    public void setParameters(Map parameters) {  
        this.parameters = parameters;  
    }  

    public String getService() {  
        return this.service;  
    }  

    public void setService(String service) {  
        this.service = service;  
    }  

    public static void main(String[] args) throws Exception {  
        OtherHttpClient client = new OtherHttpClient();  
        client.setProxy("10.100.11.148", "909");  
        client.setUrl("http://www.baidu.com");  
        client.addParameter("test1", "1");  
        String returnContent = client.post();  
        System.out.println(returnContent);  
    }  
}