zoukankan      html  css  js  c++  java
  • HttpClient工具类

    HttpClientUtils

    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.EOFException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.HttpURLConnection;
    import java.net.URI;
    import java.net.URL;
    import java.net.URLConnection;
    import java.security.KeyManagementException;
    import java.security.NoSuchAlgorithmException;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
     
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLException;
    import javax.net.ssl.SSLSession;
    import javax.net.ssl.SSLSocket;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
     
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.apache.http.Consts;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.HttpStatus;
    import org.apache.http.NameValuePair;
    import org.apache.http.ParseException;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.methods.RequestBuilder;
    import org.apache.http.client.utils.URIBuilder;
    import org.apache.http.client.utils.URLEncodedUtils;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.conn.ssl.X509HostnameVerifier;
    import org.apache.http.entity.ByteArrayEntity;
    import org.apache.http.entity.ContentType;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicHeader;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.params.BasicHttpParams;
    import org.apache.http.params.HttpConnectionParams;
    import org.apache.http.params.HttpParams;
    import org.apache.http.protocol.HTTP;
    import org.apache.http.util.ByteArrayBuffer;
    import org.apache.http.util.EntityUtils;
     
    /**
     * 封装了一些采用HttpClient发送HTTP请求的方法
     * 
     * @see 本工具所采用的是最新的HttpComponents-Client-4.2.1
     */
    public class HttpClientUtils {
     
    	private static Log logger = LogFactory.getLog(HttpClientUtils.class);
     
    	/**
    	 * 设置请求头和参数 post提交
    	 * 
    	 * @param urlStr
    	 *            地址
    	 * @param headMap
    	 *            请求头
    	 * @param paramMap
    	 *            内容参数
    	 * @return
    	 */
    	public static String connectPost(String urlStr, Map<String, String> headMap, Map<String, String> paramMap) {
    		logger.info("========设置请求头和参数并以 post提交=======");
    		URL url;
    		String sCurrentLine = "";
    		String sTotalString = "";
     
    		DataOutputStream out = null;
     
    		try {
    			url = new URL(urlStr);
    			logger.info("请求地址:" + urlStr);
    			URLConnection URLconnection = url.openConnection();
    			HttpURLConnection httpConnection = (HttpURLConnection) URLconnection;
    			// httpConnection.setRequestProperty("Content-type", "application/json");
    			httpConnection.setRequestProperty("Accept-Charset", "utf-8");
    			httpConnection.setRequestProperty("contentType", "utf-8");
     
    			if (headMap != null && !headMap.isEmpty()) {
    				for (String key : headMap.keySet()) {
    					logger.info("头部信息key:" + key + "===值: " + headMap.get(key));
    					httpConnection.setRequestProperty(key, headMap.get(key));
    				}
    			}
     
    			httpConnection.setRequestMethod("POST");
     
    			httpConnection.setDoOutput(true);
    			httpConnection.setDoInput(true);
     
    			StringBuffer params = new StringBuffer();
    			// 表单参数与get形式一样
    			if (paramMap != null && !paramMap.isEmpty()) {
    				for (String key : paramMap.keySet()) {
    					if (params.length() > 1) {
    						params.append("&");
    					}
    					params.append(key).append("=").append(paramMap.get(key).trim());
     
    				}
    				logger.info("请求参数: " + params.toString());
    			}
    			//System.out.println("params = " + params.toString());
    			out = new DataOutputStream(httpConnection.getOutputStream());
    			// 发送请求参数
    			if (params!=null) {
    				out.writeBytes(params.toString());
    			}
    			// flush输出流的缓冲
    			out.flush();
    			// int responseCode = httpConnection.getResponseCode();
    			// if (responseCode == HttpURLConnection.HTTP_OK) {
    			InputStream urlStream = httpConnection.getInputStream();
    			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlStream));
     
    			while ((sCurrentLine = bufferedReader.readLine()) != null) {
    				sTotalString += sCurrentLine;
    			}
    			// //System.out.println(sTotalString);
    			// 假设该url页面输出为"OK"
     
    			// }else{
    			// System.err.println("FIAL");
    			// }
    		} catch (Exception e) {
    			logger.info("请求错误: " + e.getMessage());
    			logger.error("系统错误:",e);
    		} finally {
     
    		}
    		logger.info("响应信息: " + sTotalString);
    		return sTotalString;
    	}
    	
    	
    	public static void test() throws Exception{
            String url = "http://******/api/hdfs/proxy/create?username=******&password=*****&uri=/test/test-xx.txt";
            byte[] bytes = "1".getBytes();
     
            HttpClient client = HttpClients.createDefault();
            RequestBuilder requestBuilder = RequestBuilder.post();
            requestBuilder.setEntity(new ByteArrayEntity(bytes));
            requestBuilder.setUri(url);
     
            HttpResponse response = client.execute(requestBuilder.build());
            HttpEntity entity = response.getEntity();
            //获得响应流
            InputStream is = entity.getContent();
     
            //读取流中内容
            ByteArrayBuffer buffer = new ByteArrayBuffer(4096);
            byte[] tmp = new byte[4096];
            int count;
            try {
                while ((count = is.read(tmp)) != -1) {
                    buffer.append(tmp, 0, count);
                }
            } catch (EOFException e) {
                logger.error("系统错误:",e);
            }
            //System.out.println(new String(buffer.toByteArray()));
        }
     
    	/**
    	 * Http Get方法
    	 * 
    	 * @param url
    	 * @param param
    	 * @return
    	 */
    	public static String doGet(String url, Map<String, String> param) {
    		// 创建Httpclient对象
    		CloseableHttpClient httpclient = HttpClients.createDefault();
    		String resultString = "";
    		CloseableHttpResponse response = null;
    		try {
    			// 创建uri
    			URIBuilder builder = new URIBuilder(url);
    			if (param != null) {
    				for (String key : param.keySet()) {
    					builder.addParameter(key, param.get(key));
    				}
    			}
    			URI uri = builder.build();
     
    			// 创建http GET请求
    			HttpGet httpGet = new HttpGet(uri);
    			
    			// 执行请求
    			response = httpclient.execute(httpGet);
    			// 判断返回状态是否为200
    			if (response.getStatusLine().getStatusCode() == 200) {
    				resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
    			}
    		} catch (Exception e) {
    			logger.error("系统错误:",e);
    		} finally {
    			try {
    				if (response != null) {
    					response.close();
    				}
    				httpclient.close();
    			} catch (IOException e) {
    				logger.error("系统错误:",e);
    			}
    		}
    		return resultString;
    	}
    	
    	/**
    	 * Http Get方法
    	 * 
    	 * @param url
    	 * @param param
    	 * @return
    	 */
    	public static String doGet(String url,Map<String, String> headMap,Map<String, String> param) {
    		// 创建Httpclient对象
    		CloseableHttpClient httpclient = HttpClients.createDefault();
    		String resultString = "";
    		CloseableHttpResponse response = null;
    		try {
    			// 创建uri
    			URIBuilder builder = new URIBuilder(url);
    			if (param != null) {
    				for (String key : param.keySet()) {
    					builder.addParameter(key, param.get(key));
    				}
    			}
    			
    			URI uri = builder.build();
     
    			// 创建http GET请求
    			HttpGet httpGet = new HttpGet(uri);
    			
    			if (headMap != null && !headMap.isEmpty()) {
    				for (String key : headMap.keySet()) {
    					logger.info("头部信息key:" + key + "===值: " + headMap.get(key));
    					httpGet.addHeader(key, headMap.get(key));
    				}
    			}		
    			
    			// 执行请求
    			response = httpclient.execute(httpGet);
    			// 判断返回状态是否为200
    			if (response.getStatusLine().getStatusCode() == 200) {
    				resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
    			}			
    		} catch (Exception e) {
    			logger.error("系统错误:",e);
    		} finally {
    			try {
    				if (response != null) {
    					response.close();
    				}
    				httpclient.close();
    			} catch (IOException e) {
    				logger.error("系统错误:",e);
    			}
    		}
    		return resultString;
    	}
     
    	public static String doGet(String url) {
    		return doGet(url, null);
    	}
     
    	/**
    	 * httpclient post方法
    	 * 
    	 * @param url
    	 * @param param
    	 * @return
    	 */
    	public static String doPost(String url,Map<String, String> headers,Map<String, String> param) {
    		// 创建Httpclient对象
    		CloseableHttpClient httpClient = HttpClients.createDefault();
    		CloseableHttpResponse response = null;
    		String resultString = "";
    		try {
    			// 创建Http Post请求
    			HttpPost httpPost = new HttpPost(url);
    			if(headers != null) {
    				for (String key : headers.keySet()) {
    					httpPost.setHeader(key, headers.get(key));
    				}
    			}
    			// 创建参数列表
    			if (param != null) {
    				List<NameValuePair> paramList = new ArrayList<>();
    				for (String key : param.keySet()) {
    					paramList.add(new BasicNameValuePair(key, param.get(key)));
    				}
    				// 模拟表单
    				UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList, "utf-8");
    				httpPost.setEntity(entity);
    			}
    			// 执行http请求
    			response = httpClient.execute(httpPost);
    			resultString = EntityUtils.toString(response.getEntity(), "utf-8");
    		} catch (Exception e) {
    			logger.error("系统错误:",e);
    		} finally {
    			try {
    				if (response!=null) {
    					response.close();
    				}
    			} catch (IOException e) {
    				logger.error("系统错误:",e);
    			}
    		}
    		return resultString;
    	}
     
    	public static String doPost(String url) {
    		return doPost(url,null,null);
    	}
     
    	/**
    	 * 请求的参数类型为json
    	 * 
    	 * @param url
    	 * @param json
    	 * @return {username:"",pass:""}
    	 */
    	public static String doPostJson(String url, String json) {
    		
    		logger.info("=====请求地址:"+url);
    		// 创建Httpclient对象
    		CloseableHttpClient httpClient = HttpClients.createDefault();
    		CloseableHttpResponse response = null;
    		String resultString = "";
    		try {
    			// 创建Http Post请求
    			HttpPost httpPost = new HttpPost(url);
    			// 创建请求内容
    			logger.info("=====请求参数:"+json);
    			StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
    			httpPost.setEntity(entity);
    			// 执行http请求
    			response = httpClient.execute(httpPost);
    			logger.info("=====响应参数:"+response);
    			resultString = EntityUtils.toString(response.getEntity(), "utf-8");
    		} catch (Exception e) {
    			logger.error("系统错误:",e);
    		} finally {
    			try {
    				if (response!=null) {
    					response.close();
    				}
    			} catch (IOException e) {
    				logger.error("系统错误:",e);
    			}
    		}
    		return resultString;
    	}
     
    	/**
    	 * 发送HTTP_GET请求
    	 * 
    	 * @see 该方法会自动关闭连接,释放资源
    	 * @param requestURL
    	 *            请求地址(含参数)
    	 * @param decodeCharset
    	 *            解码字符集,解析响应数据时用之,其为null时默认采用UTF-8解码
    	 * @return 远程主机响应正文
    	 */
    	public static String sendGetRequest(String reqURL, String decodeCharset) {
    		long responseLength = 0; // 响应长度
    		String responseContent = null; // 响应内容
    		HttpClient httpClient = new DefaultHttpClient(); // 创建默认的httpClient实例
    		HttpGet httpGet = new HttpGet(reqURL); // 创建org.apache.http.client.methods.HttpGet
    		try {
    			HttpResponse response = httpClient.execute(httpGet); // 执行GET请求
    			HttpEntity entity = response.getEntity(); // 获取响应实体
    			if (null != entity) {
    				responseLength = entity.getContentLength();
    				responseContent = EntityUtils.toString(entity, decodeCharset == null ? "UTF-8" : decodeCharset);
    				EntityUtils.consume(entity); // Consume response content
    			}
    			//System.out.println("请求地址: " + httpGet.getURI());
    			//System.out.println("响应状态: " + response.getStatusLine());
    			//System.out.println("响应长度: " + responseLength);
    			//System.out.println("响应内容: " + responseContent);
    		} catch (ClientProtocolException e) {
    			logger.debug("该异常通常是协议错误导致,比如构造HttpGet对象时传入的协议不对(将'http'写成'htp')或者服务器端返回的内容不符合HTTP协议要求等,堆栈信息如下", e);
    		} catch (ParseException e) {
    			logger.debug(e.getMessage(), e);
    		} catch (IOException e) {
    			logger.debug("该异常通常是网络原因引起的,如HTTP服务器未启动等,堆栈信息如下", e);
    		} finally {
    			httpClient.getConnectionManager().shutdown(); // 关闭连接,释放资源
    		}
    		return responseContent;
    	}
     
    	/**
    	 * 发送HTTP_POST请求
    	 * 
    	 * @see 该方法为<code>sendPostRequest(String,String,boolean,String,String)</code>的简化方法
    	 * @see 该方法在对请求数据的编码和响应数据的解码时,所采用的字符集均为UTF-8
    	 * @see 当<code>isEncoder=true</code>时,其会自动对<code>sendData</code>中的[中文][|][
    	 *      ]等特殊字符进行<code>URLEncoder.encode(string,"UTF-8")</code>
    	 * @param isEncoder
    	 *            用于指明请求数据是否需要UTF-8编码,true为需要
    	 */
    	public static String sendPostRequest(String reqURL, String sendData, boolean isEncoder) {
    		return sendPostRequest(reqURL, sendData, isEncoder, null, null);
    	}
     
    	/**
    	 * 发送HTTP_POST请求
    	 * 
    	 * @see 该方法会自动关闭连接,释放资源
    	 * @see 当<code>isEncoder=true</code>时,其会自动对<code>sendData</code>中的[中文][|][
    	 *      ]等特殊字符进行<code>URLEncoder.encode(string,encodeCharset)</code>
    	 * @param reqURL
    	 *            请求地址
    	 * @param sendData
    	 *            请求参数,若有多个参数则应拼接成param11=value11&22=value22&33=value33的形式后,传入该参数中
    	 * @param isEncoder
    	 *            请求数据是否需要encodeCharset编码,true为需要
    	 * @param encodeCharset
    	 *            编码字符集,编码请求数据时用之,其为null时默认采用UTF-8解码
    	 * @param decodeCharset
    	 *            解码字符集,解析响应数据时用之,其为null时默认采用UTF-8解码
    	 * @return 远程主机响应正文
    	 */
    	public static String sendPostRequest(String reqURL, String sendData, boolean isEncoder, String encodeCharset,
    			String decodeCharset) {
    		String responseContent = null;
    		HttpClient httpClient = new DefaultHttpClient();
     
    		HttpPost httpPost = new HttpPost(reqURL);
    		// httpPost.setHeader(HTTP.CONTENT_TYPE, "application/x-www-form-urlencoded;
    		// charset=UTF-8");
    		httpPost.setHeader(HTTP.CONTENT_TYPE, "application/x-www-form-urlencoded");
    		try {
    			if (isEncoder) {
    				List<NameValuePair> formParams = new ArrayList<NameValuePair>();
    				for (String str : sendData.split("&")) {
    					formParams.add(new BasicNameValuePair(str.substring(0, str.indexOf("=")),
    							str.substring(str.indexOf("=") + 1)));
    				}
    				httpPost.setEntity(new StringEntity(
    						URLEncodedUtils.format(formParams, encodeCharset == null ? "UTF-8" : encodeCharset)));
    			} else {
    				httpPost.setEntity(new StringEntity(sendData));
    			}
     
    			HttpResponse response = httpClient.execute(httpPost);
    			HttpEntity entity = response.getEntity();
    			if (null != entity) {
    				responseContent = EntityUtils.toString(entity, decodeCharset == null ? "UTF-8" : decodeCharset);
    				EntityUtils.consume(entity);
    			}
    		} catch (Exception e) {
    			logger.debug("与[" + reqURL + "]通信过程中发生异常,堆栈信息如下", e);
    		} finally {
    			httpClient.getConnectionManager().shutdown();
    		}
    		return responseContent;
    	}
     
    	/**
    	 * 发送HTTP_POST请求
    	 * 
    	 * @see 该方法会自动关闭连接,释放资源
    	 * @see 该方法会自动对<code>params</code>中的[中文][|][
    	 *      ]等特殊字符进行<code>URLEncoder.encode(string,encodeCharset)</code>
    	 * @param reqURL
    	 *            请求地址
    	 * @param params
    	 *            请求参数
    	 * @param encodeCharset
    	 *            编码字符集,编码请求数据时用之,其为null时默认采用UTF-8解码
    	 * @param decodeCharset
    	 *            解码字符集,解析响应数据时用之,其为null时默认采用UTF-8解码
    	 * @return 远程主机响应正文
    	 */
    	public static String sendPostRequest(String reqURL, Map<String, String> params, String encodeCharset,
    			String decodeCharset) {
    		String responseContent = null;
    		HttpClient httpClient = new DefaultHttpClient();
     
    		HttpPost httpPost = new HttpPost(reqURL);
    		List<NameValuePair> formParams = new ArrayList<NameValuePair>(); // 创建参数队列
    		for (Map.Entry<String, String> entry : params.entrySet()) {
    			formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
    		}
    		try {
    			httpPost.setEntity(new UrlEncodedFormEntity(formParams, encodeCharset == null ? "UTF-8" : encodeCharset));
     
    			HttpResponse response = httpClient.execute(httpPost);
    			HttpEntity entity = response.getEntity();
    			if (null != entity) {
    				responseContent = EntityUtils.toString(entity, decodeCharset == null ? "UTF-8" : decodeCharset);
    				EntityUtils.consume(entity);
    			}
    		} catch (Exception e) {
    			logger.debug("与[" + reqURL + "]通信过程中发生异常,堆栈信息如下", e);
    		} finally {
    			httpClient.getConnectionManager().shutdown();
    		}
    		return responseContent;
    	}
     
    	/**
    	 * 发送HTTPS_POST请求
    	 * 
    	 * @see 该方法为<code>sendPostSSLRequest(String,Map<String,String>,String,String)</code>方法的简化方法
    	 * @see 该方法在对请求数据的编码和响应数据的解码时,所采用的字符集均为UTF-8
    	 * @see 该方法会自动对<code>params</code>中的[中文][|][
    	 *      ]等特殊字符进行<code>URLEncoder.encode(string,"UTF-8")</code>
    	 */
    	public static String sendPostSSLRequest(String reqURL, Map<String, String> params) {
    		return sendPostSSLRequest(reqURL, params, null, null);
    	}
     
    	/**
    	 * 发送HTTPS_POST请求
    	 * 
    	 * @see 该方法会自动关闭连接,释放资源
    	 * @see 该方法会自动对<code>params</code>中的[中文][|][
    	 *      ]等特殊字符进行<code>URLEncoder.encode(string,encodeCharset)</code>
    	 * @param reqURL
    	 *            请求地址
    	 * @param params
    	 *            请求参数
    	 * @param encodeCharset
    	 *            编码字符集,编码请求数据时用之,其为null时默认采用UTF-8解码
    	 * @param decodeCharset
    	 *            解码字符集,解析响应数据时用之,其为null时默认采用UTF-8解码
    	 * @return 远程主机响应正文
    	 */
    	public static String sendPostSSLRequest(String reqURL, Map<String, String> params, String encodeCharset,
    			String decodeCharset) {
    		String responseContent = "";
    		HttpClient httpClient = new DefaultHttpClient();
    		X509TrustManager xtm = new X509TrustManager() {
    			public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    			}
     
    			public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    			}
     
    			public X509Certificate[] getAcceptedIssuers() {
    				return null;
    			}
    		};
    		try {
    			SSLContext ctx = SSLContext.getInstance("TLS");
    			ctx.init(null, new TrustManager[] { xtm }, null);
    			SSLSocketFactory socketFactory = new SSLSocketFactory(ctx);
    			httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", 443, socketFactory));
     
    			HttpPost httpPost = new HttpPost(reqURL);
    			List<NameValuePair> formParams = new ArrayList<NameValuePair>();
    			for (Map.Entry<String, String> entry : params.entrySet()) {
    				formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
    			}
    			httpPost.setEntity(new UrlEncodedFormEntity(formParams, encodeCharset == null ? "UTF-8" : encodeCharset));
     
    			HttpResponse response = httpClient.execute(httpPost);
    			HttpEntity entity = response.getEntity();
    			if (null != entity) {
    				responseContent = EntityUtils.toString(entity, decodeCharset == null ? "UTF-8" : decodeCharset);
    				EntityUtils.consume(entity);
    			}
    		} catch (Exception e) {
    			logger.debug("与[" + reqURL + "]通信过程中发生异常,堆栈信息为", e);
    		} finally {
    			httpClient.getConnectionManager().shutdown();
    		}
    		return responseContent;
    	}
     
    	/**
    	 * 发送HTTP_POST请求
    	 * 
    	 * @see 若发送的<code>params</code>中含有中文,记得按照双方约定的字符集将中文<code>URLEncoder.encode(string,encodeCharset)</code>
    	 * @see 本方法默认的连接超时时间为30秒,默认的读取超时时间为30秒
    	 * @param reqURL
    	 *            请求地址
    	 * @param params
    	 *            发送到远程主机的正文数据,其数据类型为<code>java.util.Map<String, String></code>
    	 * @return 远程主机响应正文`HTTP状态码,如<code>"SUCCESS`200"</code><br>
    	 *         若通信过程中发生异常则返回"Failed`HTTP状态码",如<code>"Failed`500"</code>
    	 */
    	public static String sendPostRequestByJava(String reqURL, Map<String, String> params) {
    		StringBuilder sendData = new StringBuilder();
    		for (Map.Entry<String, String> entry : params.entrySet()) {
    			sendData.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
    		}
    		if (sendData.length() > 0) {
    			sendData.setLength(sendData.length() - 1); // 删除最后一个&符号
    		}
    		return sendPostRequestByJava(reqURL, sendData.toString());
    	}
     
    	/**
    	 * 发送HTTP_POST请求
    	 * 
    	 * @see 若发送的<code>sendData</code>中含有中文,记得按照双方约定的字符集将中文<code>URLEncoder.encode(string,encodeCharset)</code>
    	 * @see 本方法默认的连接超时时间为30秒,默认的读取超时时间为30秒
    	 * @param reqURL
    	 *            请求地址
    	 * @param sendData
    	 *            发送到远程主机的正文数据
    	 * @return 远程主机响应正文`HTTP状态码,如<code>"SUCCESS`200"</code><br>
    	 *         若通信过程中发生异常则返回"Failed`HTTP状态码",如<code>"Failed`500"</code>
    	 */
    	public static String sendPostRequestByJava(String reqURL, String sendData) {
    		HttpURLConnection httpURLConnection = null;
    		OutputStream out = null; // 写
    		InputStream in = null; // 读
    		int httpStatusCode = 0; // 远程主机响应的HTTP状态码
    		try {
    			URL sendUrl = new URL(reqURL);
    			httpURLConnection = (HttpURLConnection) sendUrl.openConnection();
    			httpURLConnection.setRequestMethod("POST");
    			httpURLConnection.setDoOutput(true); // 指示应用程序要将数据写入URL连接,其值默认为false
    			httpURLConnection.setUseCaches(false);
    			httpURLConnection.setConnectTimeout(30000); // 30秒连接超时
    			httpURLConnection.setReadTimeout(30000); // 30秒读取超时
     
    			out = httpURLConnection.getOutputStream();
    			out.write(sendData.toString().getBytes());
     
    			// 清空缓冲区,发送数据
    			out.flush();
     
    			// 获取HTTP状态码
    			httpStatusCode = httpURLConnection.getResponseCode();
     
    			in = httpURLConnection.getInputStream();
    			byte[] byteDatas = new byte[in.available()];
    			in.read(byteDatas);
    			return new String(byteDatas) + "`" + httpStatusCode;
    		} catch (Exception e) {
    			logger.debug(e.getMessage());
    			return "Failed`" + httpStatusCode;
    		} finally {
    			if (out != null) {
    				try {
    					out.close();
    				} catch (Exception e) {
    					logger.debug("关闭输出流时发生异常,堆栈信息如下", e);
    				}
    			}
    			if (in != null) {
    				try {
    					in.close();
    				} catch (Exception e) {
    					logger.debug("关闭输入流时发生异常,堆栈信息如下", e);
    				}
    			}
    			if (httpURLConnection != null) {
    				httpURLConnection.disconnect();
    				httpURLConnection = null;
    			}
    		}
    	}
     
    	/**
    	 * https posp请求,可以绕过证书校验
    	 * 
    	 * @param url
    	 * @param params
    	 * @return
    	 */
    	public static final String sendHttpsRequestByPost(String url, Map<String, String> params) {
    		String responseContent = null;
    		HttpClient httpClient = new DefaultHttpClient();
    		// 创建TrustManager
    		X509TrustManager xtm = new X509TrustManager() {
    			public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    			}
     
    			public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    			}
     
    			public X509Certificate[] getAcceptedIssuers() {
    				return null;
    			}
    		};
    		// 这个好像是HOST验证
    		X509HostnameVerifier hostnameVerifier = new X509HostnameVerifier() {
    			public boolean verify(String arg0, SSLSession arg1) {
    				return true;
    			}
     
    			public void verify(String arg0, SSLSocket arg1) throws IOException {
    			}
     
    			public void verify(String arg0, String[] arg1, String[] arg2) throws SSLException {
    			}
     
    			public void verify(String arg0, X509Certificate arg1) throws SSLException {
    			}
    		};
    		try {
    			// TLS1.0与SSL3.0基本上没有太大的差别,可粗略理解为TLS是SSL的继承者,但它们使用的是相同的SSLContext
    			SSLContext ctx = SSLContext.getInstance("TLS");
    			// 使用TrustManager来初始化该上下文,TrustManager只是被SSL的Socket所使用
    			ctx.init(null, new TrustManager[] { xtm }, null);
    			// 创建SSLSocketFactory
    			SSLSocketFactory socketFactory = new SSLSocketFactory(ctx);
    			socketFactory.setHostnameVerifier(hostnameVerifier);
    			// 通过SchemeRegistry将SSLSocketFactory注册到我们的HttpClient上
    			httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", socketFactory, 443));
    			HttpPost httpPost = new HttpPost(url);
    			List<NameValuePair> formParams = new ArrayList<NameValuePair>(); // 构建POST请求的表单参数
    			for (Map.Entry<String, String> entry : params.entrySet()) {
    				formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
    			}
    			httpPost.setEntity(new UrlEncodedFormEntity(formParams, "UTF-8"));
    			HttpResponse response = httpClient.execute(httpPost);
    			HttpEntity entity = response.getEntity(); // 获取响应实体
    			if (entity != null) {
    				responseContent = EntityUtils.toString(entity, "UTF-8");
    			}
    		} catch (KeyManagementException e) {
    			logger.error("系统错误:",e);
    		} catch (NoSuchAlgorithmException e) {
    			logger.error("系统错误:",e);
    		} catch (UnsupportedEncodingException e) {
    			logger.error("系统错误:",e);
    		} catch (ClientProtocolException e) {
    			logger.error("系统错误:",e);
    		} catch (ParseException e) {
    			logger.error("系统错误:",e);
    		} catch (IOException e) {
    			logger.error("系统错误:",e);
    		} finally {
    			// 关闭连接,释放资源
    			httpClient.getConnectionManager().shutdown();
    		}
    		return responseContent;
    	}
     
    	/**
    	 * 发送HTTP_POST请求,json格式数据
    	 * 
    	 * @param url
    	 * @param body
    	 * @return
    	 * @throws Exception
    	 */
    	public static String sendPostByJson(String url, String body) throws Exception {
    		CloseableHttpClient httpclient = HttpClients.custom().build();
    		HttpPost post = null;
    		String resData = null;
    		CloseableHttpResponse result = null;
    		try {
    			post = new HttpPost(url);
    			HttpEntity entity2 = new StringEntity(body, Consts.UTF_8);
    			post.setConfig(RequestConfig.custom().setConnectTimeout(30000).setSocketTimeout(30000).build());
    			post.setHeader("Content-Type", "application/json");
    			post.setHeader("Access-Token", "sund2f3bf3e7ecea902bcdb7027e9139a02");
    			post.setEntity(entity2);
    			result = httpclient.execute(post);
    			if (HttpStatus.SC_OK == result.getStatusLine().getStatusCode()) {
    				resData = EntityUtils.toString(result.getEntity());
    			}
    		} finally {
    			if (result != null) {
    				result.close();
    			}
    			if (post != null) {
    				post.releaseConnection();
    			}
    			httpclient.close();
    		}
    		return resData;
    	}
     
    	/**
    	 * HttpPost发送header,Content(json格式)
    	 * 
    	 * @param url
    	 * @param json
    	 * @param headers
    	 * @return
    	 */
    	public static String post(String url, Map<String, String> headers, Map<String, String> jsonMap) {
     
    		HttpClient client = new DefaultHttpClient();
    		HttpPost post = new HttpPost(url);
    		logger.info("请求地址:" + url);
    		// post.setHeader("Content-Type", "application/x-www-form-urlencoded");
    		logger.info("请求头信息:" + headers);
    		if (headers != null) {
    			Set<String> keys = headers.keySet();
    			for (Map.Entry<String, String> entrdy : headers.entrySet()) {
    				post.addHeader(entrdy.getKey(), entrdy.getValue());
    				//System.out.println("headers:" + entrdy.getKey() + ",值" + entrdy.getValue());
    			}
     
    		}
    		String charset = null;
    		try {
    			StringEntity s = new StringEntity(jsonMap.toString(), "utf-8");
    			logger.info("请求json参数:" + jsonMap);
    			// s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
    			// s.setContentType("application/json");
    			// s.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
    			post.setEntity(s);
     
    			logger.info("请求实体数据:" + post);
    			// HttpResponse res = client.execute(post);
    			HttpResponse httpResponse = client.execute(post);
    			InputStream inStream = httpResponse.getEntity().getContent();
    			BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "utf-8"));
    			StringBuilder strber = new StringBuilder();
     
    			String line = null;
    			while ((line = reader.readLine()) != null)
    				strber.append(line + "\n");
    			inStream.close();
    			logger.info("MobilpriseActivity:" + strber);
     
    			if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    				HttpEntity entity = httpResponse.getEntity();
    				charset = EntityUtils.getContentCharSet(entity);
    			}
    		} catch (Exception e) {
    			logger.info("报错咯:" + e.getMessage());
    			throw new RuntimeException(e);
    		}
    		logger.info("响应参数:" + charset);
    		return charset;
    	}
     
    	public static void main(String[] args) {
    	try {
    		Map<String,String> headmap =  new HashMap<String,String>();
    		headmap.put("Access-Token", "sund2f3bf3e7ecea902bcdb7027e9139a02");
    		Map<String,String> paramap =  new HashMap<String,String>();
    		paramap.put("customerDeptId", "38");
    		paramap.put("postCode", "qqqq");
    		System.out.println(doPost("http://10.39.137.100/api/needs/getInfoByCondition",headmap,paramap));
    		//System.out.println(sendPostByJson("http://10.39.137.100/api/needs/getInfoByCondition","{\"customerDeptId\":38,\"postCode\":\"qqqq\"}"));
    	} catch (Exception e) {		
    		logger.error("系统错误:",e);
    	}
     
    	}
     
    }
    

    请求示例:

    // 设置请求参数
    Map<String, String> param = new HashMap<String, String>();
    param.put("test", "test");
    // 设置请求头信息
    Map<String, String> headMap =new HashMap<String, String>();
    headMap.put("Authorization", token);
    headMap.put("Content-type", "application/json");
    // 判断token获取的user信息
    String tkJson = HttpClientUtils.connectPost(ssoGetUserURL, headMap, param);
    JSONObject resultJson = JSONObject.fromObject(tkJson);
    String employeeNo=json.getString("EmployeeNo");
    

    相关依赖包

    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpcore</artifactId>
        <version>4.4.12</version>
    </dependency>
    

    原文链接:https://blog.csdn.net/lchq1995/article/details/88293047

  • 相关阅读:
    Unity3d vector3.forward和transform.forward的区别!
    UGUI实现摇杆
    UGUI实现拼图游戏
    Unity3d打包发布Android程序
    兼容PC和手机触摸代码
    unity3d中Transform组件变量详解
    运算符重载
    扩展方法
    string.Format格式化输出
    网络编程之Socket的TCP协议实现客户端与客户端之间的通信
  • 原文地址:https://www.cnblogs.com/zhaokejin/p/15605270.html
Copyright © 2011-2022 走看看