HTTP接口開發專題二(發送http請求的接口工具類)


import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
/**
 * Http工具類*/
public class HttpUtils {
 /**
     * 解析出url參數中的鍵值對 如 "index.jsp?Action=del&id=123",解析出Action:del,id:123存入map中
     * 
     * @param URL
     *            url地址
     * @return url請求參數部分
     */
    public static Map<String, String> URLRequest(String URL) {
        Map<String, String> mapRequest = new HashMap<String, String>();

        String[] arrSplit = null;

        String strUrlParam = truncateUrlPage(URL);
        if (strUrlParam == null) {
            return mapRequest;
        }
        // 每個鍵值為一組 www.2cto.com
        arrSplit = strUrlParam.split("[&]");
        for (String strSplit : arrSplit) {
            String[] arrSplitEqual = null;
            arrSplitEqual = strSplit.split("[=]");

            // 解析出鍵值
            if (arrSplitEqual.length > 1) {
                // 正確解析
                mapRequest.put(arrSplitEqual[0], arrSplitEqual[1]);

            } else {
                if (arrSplitEqual[0] != "") {
                    // 只有參數沒有值,不加入
                    mapRequest.put(arrSplitEqual[0], "");
                }
            }
        }
        return mapRequest;
    }
    
    /**
     * 發起HTTP POST請求。
     * @param urlStr 請求URL
     * @param params 請求參數
     * @return 響應結果
     */
    public static String post(String urlStr, Map<String, Object> params) {
        URL url = null;
        StringBuffer buff = new StringBuffer("");
        
        HttpURLConnection urlConn = null;
        OutputStream out = null;
        BufferedReader in = null;
        try {
            Set<Entry<String, Object>> keySet = params.entrySet();
            
            int i = 0;
//將map參數轉換為 key1=value1&key2=value2 的形式
for (Iterator<Entry<String, Object>> iter = keySet.iterator(); iter.hasNext();) { Entry<String,Object> entry = iter.next(); // 跳過值為null的參數 if(entry.getValue() == null) { continue; } if (i > 0) { buff.append("&"); } buff.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue().toString(), "UTF-8")); i++; } url = new URL(urlStr);//把urlStr轉變為URL類對象
       //用來解決對於https接口地址的訪問 HostnameVerifier hv
= new HostnameVerifier() { public boolean verify(String urlHostName, SSLSession session) { System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost()); return true; } }; //訪問https接口時,服務器不信任我們自己創建的證書,所以在代碼中必須要忽略證書信任問題。只要在創建connection之前調用兩個方法: trustAllHttpsCertificates(); HttpsURLConnection.setDefaultHostnameVerifier(hv); urlConn = (HttpURLConnection) url.openConnection(); //打開URL連接 urlConn.setDefaultUseCaches(false); //post請求不能使用緩存 urlConn.setConnectTimeout(30000); urlConn.setReadTimeout(60000); urlConn.setDoInput(true); urlConn.setDoOutput(true); urlConn.setRequestMethod("POST"); urlConn.setUseCaches(false); //post請求不能使用緩存 urlConn.setRequestProperty("Accept-Charset","UTF-8"); //設置編碼方式 //沒有設置內容類型,默認是Content-Type: application/x-www-form-urlencoded out = urlConn.getOutputStream(); out.write(buff.toString().getBytes("UTF-8")); //請求體 in = new BufferedReader(new InputStreamReader(urlConn.getInputStream(),"UTF-8")); String data = ""; StringBuffer sb = new StringBuffer(""); while (null != (data = in.readLine())) { sb.append(data); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } finally { try { if(out != null) { out.close(); } if(in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } if(urlConn != null) { urlConn.disconnect(); } } return ""; } /** * 發起HTTP POST請求。 * @param urlStr 請求URL * @param output POST數據,這里是json格式字符串 * @return 響應結果 */ public static String post(String urlStr, String output) { URL url = null; HttpURLConnection urlConn = null; OutputStream out = null; BufferedReader in = null; try { url = new URL(urlStr); urlConn = (HttpURLConnection) url.openConnection(); urlConn.setDefaultUseCaches(false); urlConn.setConnectTimeout(30000); urlConn.setReadTimeout(60000); urlConn.setDoInput(true); urlConn.setDoOutput(true); urlConn.setRequestMethod("POST"); urlConn.setUseCaches(false); urlConn.setRequestProperty("Accept-Charset","UTF-8"); //HttpURLConnection.setRequestProperty(String key,String value);  設置http請求頭,這里設置編碼格式 urlConn.setRequestProperty("Content-Type", "application/json"); //設置內容類型:json格式 out = urlConn.getOutputStream(); out.write(output.getBytes("UTF-8")); in = new BufferedReader(new InputStreamReader(urlConn.getInputStream(),"UTF-8")); String data = ""; StringBuffer sb = new StringBuffer(""); while (null != (data = in.readLine())) { sb.append(data); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } finally { try { if(out != null) { out.close(); } if(in != null) { in.close(); } } catch (IOException e) { e.printStackTrace(); } if(urlConn != null) { urlConn.disconnect(); } } return ""; } //用來解決不能訪問https請求的問題 private static void trustAllHttpsCertificates() throws Exception { javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1]; javax.net.ssl.TrustManager tm = new miTM(); trustAllCerts[0] = tm; javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext .getInstance("SSL"); sc.init(null, trustAllCerts, null); javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc .getSocketFactory()); } //用來解決不能訪問https請求的問題 private static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public boolean isServerTrusted( java.security.cert.X509Certificate[] certs) { return true; } public boolean isClientTrusted( java.security.cert.X509Certificate[] certs) { return true; } public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException { return; } public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException { return; } }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM