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"); //设置编码方式 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 params 请求参数 * @return 响应结果 */ public static Map<String,Object> postJson(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; 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); 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"); urlConn.setRequestProperty("Content-Type", "application/json"); out = urlConn.getOutputStream(); out.write(buff.toString().getBytes("UTF-8")); // 请求返回的状态 String jsonStr = null; if (urlConn.getResponseCode() == 200) { System.out.println("连接成功"); // 请求返回的数据 jsonStr = changeInputStream(urlConn.getInputStream(),"UTF-8"); } else { System.out.println("no++"); } System.out.println("jsonStr:"+jsonStr); //转换成jsonMap Map<String,Object> rtJsonMap = null; if(jsonStr!=null && jsonStr.length()>0){ rtJsonMap = JsonUtil.jsonStrToMap(jsonStr); } return rtJsonMap; } 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 null; } /** * 发起HTTP POST请求。 * @param urlStr 请求URL * @param output POST数据 * @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"); //设置内容类型 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()); } 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; } }
//输入流接收接口返回的数据
private static String changeInputStream(InputStream inputStream,
String encode) throws IOException {

String jsonString = null;

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
while ((len = inputStream.read(data)) != -1) {
outputStream.write(data, 0, len);
}

jsonString = new String(outputStream.toByteArray(), encode);

inputStream.close();

return jsonString;
}
}

猜你喜欢

转载自www.cnblogs.com/cainiao-Shun666/p/9182464.html