zoukankan      html  css  js  c++  java
  • Java中发送http的get、post请求

     

     近期做项目中,须要把消息通过中间件的形式通过http请求的方式推送给第三方,因此用到了http协议,小编花费了一个多小时。对于http协议中的post和get请求,封装了一个工具类。以下与大家分享一下。

    有不好的地方请多多不吝赐教。

    /**     
     * @FileName: HttpTest.java   
     * @Package:com.io   
     * @Description: TODO  
     * @author: LUCKY    
     * @date:2016年1月6日 下午3:49:28   
     * @version V1.0     
     */
    package com.io;
    
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.security.SecureRandom;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.KeyManager;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSession;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
    
    import com.alibaba.common.lang.StringUtil;
    
    /**
     * @ClassName: HttpTest
     * @Description: 自己開始封装的HTTP连接工具,http连接传递的參数封装到一个对象里面,
     *               http中get请求时,是把參数拼接到url后面的,而post请求直接输出就可以
     * @author: LUCKY
     * @date:2016年1月6日 下午3:49:28
     */
    public class HttpTest {
    
    	private static final String METHOD_POST = "POST";
    	private static final String METHOD_GET = "GET";
    	private static final String DEFAULT_CHARSET = "UTF-8";
    	private static final String HTTPS = "https";
    	private static final String TLS = "tls";
    	private static final String CTYPE = "application/x-www-form-urlencoded;charset="
    			+ DEFAULT_CHARSET;
    
    	public static void main(String[] args) throws Exception {
    		Map<String, String> param = new HashMap<String, String>();
    		param.put("body", String.valueOf(System.currentTimeMillis()));
    		param.put("tag", "撒点粉");
    		String string = doGet(
    				"	http://localhost/receive.do", param,
    				3000, 3000);
    		String aa = doPost(
    				"	http://localhost/receive.do", param,
    				3000, 3000);
    		System.out.println(string.length());
    		System.out.println(string);
    	}
    
    	/**
    	 * @throws Exception
    	 * @Title: doPost
    	 * @Description: doPost发送请求操作
    	 * @param @param url
    	 * @param @param params
    	 * @param @param readTimeOut
    	 * @param @param connectTimeOut
    	 * @param @return
    	 * @return String
    	 * @throws
    	 */
    	public static String doPost(String url, Map<String, String> params,
    			int readTimeOut, int connectTimeOut) throws Exception {
    		HttpURLConnection connection = null;
    		OutputStream out = null;
    		String result = null;
    		try {
    			connection = getConnection(new URL(url), readTimeOut,
    					connectTimeOut, METHOD_POST, CTYPE, null);
    			byte[] content = new byte[0];
    			String param = getUrl(params, DEFAULT_CHARSET);
    			if (StringUtil.isNotEmpty(param)) {
    				content = param.getBytes(DEFAULT_CHARSET);
    			}
    			out = connection.getOutputStream();
    			// post传送消息内容
    			out.write(content);
    			// 接受的返回值通过buffer来接受
    
    			result = responseAsString(connection);
    		} catch (IOException e) {
    			e.printStackTrace();
    			throw e;
    		} finally {
    			if (connection != null) {
    				connection.disconnect();
    			}
    		}
    
    		return result;
    
    	}
    
    	/**
    	 * @Title: doGet
    	 * @Description: doGet发送消息请求
    	 * @param @param url
    	 * @param @param params
    	 * @param @param readTimeOut
    	 * @param @param connectTimeOut
    	 * @param @return
    	 * @return String
    	 * @throws
    	 */
    	public static String doGet(String url, Map<String, String> params,
    			int readTimeOut, int connectTimeOut) {
    
    		HttpURLConnection connection = null;
    		String result=null;
    		try {
    			String query = getUrl(params, DEFAULT_CHARSET);
    			connection = getConnection(new URL(buildUrl(url, query)),
    					readTimeOut, connectTimeOut, METHOD_GET, CTYPE, null);
           result=responseAsString(connection);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (connection != null) {
    				connection.disconnect();
    			}
    		}
    		return result;
    	}
    
    	// 把doGet和doPost请求最后的接受參数再次的抽取出来
    	private static String responseAsString(HttpURLConnection connection) {
    		StringBuffer buffer = new StringBuffer();
    		InputStreamReader reader = null;
    		OutputStream out = null;
    		try {
    			// 假设返回成功
    			if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) {
    				reader = new InputStreamReader(connection.getInputStream());
    				char[] ch = new char[1024];
    				int x = 0;
    				while ((x = reader.read(ch)) != -1) {
    					buffer.append(ch, 0, x);
    				}
    			}
    
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			if (connection != null) {
    				connection.disconnect();
    			}
    		}
    
    		return buffer.toString();
    	}
    
    	// 须要再写一个getConnection的方法,把doPost和doGet的connection都抽取出来
    	private static HttpURLConnection getConnection(URL url, int readTimeOut,
    			int connectTimeOut, String method, String ctype,
    			Map<String, String> headMap) throws Exception {
    		HttpURLConnection connection = null;
    		if (url == null) {
    			return null;
    		}
    		if (HTTPS.equals(url.getProtocol())) {
    			SSLContext ctx = null;
    			try {
    				ctx = SSLContext.getInstance(TLS);
    				ctx.init(new KeyManager[0],
    						new TrustManager[] { new DefaultTrustManager() },
    						new SecureRandom());
    			} catch (Exception e) {
    				throw new IOException(e);
    			}
    			HttpsURLConnection connHttps = (HttpsURLConnection) url
    					.openConnection();
    			connHttps.setSSLSocketFactory(ctx.getSocketFactory());
    			connHttps.setHostnameVerifier(new HostnameVerifier() {
    
    				public boolean verify(String hostname, SSLSession session) {
    					return true;
    				}
    			});
    			connection = connHttps;
    		} else {
    			connection = (HttpURLConnection) url.openConnection();
    		}
    
    		connection.setReadTimeout(readTimeOut);
    		connection.setDoInput(true);
    		connection.setDoOutput(true);
    		connection.setRequestMethod(method);
    		connection.setConnectTimeout(connectTimeOut);
    		connection.setRequestProperty("Accept",
    				"text/xml,text/javascript,text/html");
    		connection.setRequestProperty("User-Agent", "top-sdk-java");
    		connection.setRequestProperty("Content-Type", ctype);
    		// 遍历设置headMap
    		if (null != headMap) {
    			Set<Entry<String, String>> entries = headMap.entrySet();
    			for (Map.Entry<String, String> entry : entries) {
    				connection.setRequestProperty(entry.getKey(), entry.getValue());
    			}
    		}
    
    		return connection;
    	}
    
    	/**
    	 * @Title: getUrl
    	 * @Description: doGet发送请求时拼接的URL
    	 * @param @param params
    	 * @param @param charset
    	 * @param @return
    	 * @param @throws UnsupportedEncodingException
    	 * @return String
    	 * @throws
    	 */
    	public static String getUrl(Map<String, String> params, String charset)
    			throws UnsupportedEncodingException {
    		StringBuffer buffer = new StringBuffer("?");
    		if (params == null && params.isEmpty()) {
    			return null;
    		}
    		// 否则的话,開始拼接须要传递的值。也就是URL?AA==BB&CC==EE这种相似的连接值
    		Set<Entry<String, String>> entries = params.entrySet();
    		for (Entry<String, String> entry : entries) {
    			String name = entry.getKey();
    			String value = entry.getValue();
    			// 还须要进行一次推断是否为空,一定要慎重
    			if (StringUtil.isNotEmpty(name) && StringUtil.isNotEmpty(value)) {
    				// 假设不为空的话。開始进行连接操作
    				buffer.append("&").append(name).append("=")
    						.append(URLEncoder.encode(value, charset));
    			}
    
    		}
    		return buffer.toString().substring(0, buffer.toString().length() - 1);
    
    	}
    
    	/**
    	 * @Title: buildUrl
    	 * @Description: 拼接url地址操作
    	 * @param @param url
    	 * @param @param query
    	 * @param @return
    	 * @return String
    	 * @throws
    	 */
    	private static String buildUrl(String url, String query) {
    		if (query == null && query.isEmpty()) {
    			return url;
    		}
    		if (url.endsWith("?")) {
    			url = url + query;
    		} else {
    			url = url + "?

    " + query; } return url; } private static class DefaultTrustManager implements X509TrustManager { public X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } } }



     很多其它有关http协议的内容,请參考:Http协议具体解释

                                                               Http协议中的Content-Type

  • 相关阅读:
    生产者消费者模式 (在已有线程下不断生产不断消费)
    Spring boot Spring cloud 框架搭建
    个人见解
    加入博客园!
    sqlserver 工具
    slqserver 拆分函数
    sqlserver 自定义函数与存储过程的区别
    sqlserver row_number() over() 理解
    C# Newtonsoft.Json JObject移除属性
    PropertyInfo 简单用法
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7043487.html
Copyright © 2011-2022 走看看