使用Apache HttpClient4.x 发送 GET POST 请求

一,介绍

创建一个HttpRequest类,该类负责向服务器发起HTTP GET, POST请求。该类的对象使用单例模式来创建,因为对于多个客户端而言,需要发送大量的HTTP请求,而每一个请求都需要调用HttpRequest类的方法向服务器建立连接,因此每一个请求都创建一个HttpRequest对象的话,对资源消耗很大。

二,发送请求

1,无参数的GET请求

	public String doGet(String uri){
		HttpGet httpGet = new HttpGet(uri);
		return sendHttpGet(httpGet);
	}


2,带多个参数的GET请求

public String doGet(String uri, List parameters){
		HttpGet httpGet = new HttpGet(uri);
		String param = null;
		try{
			param = EntityUtils.toString(new UrlEncodedFormEntity(parameters));
			//build get uri with params
			httpGet.setURI(new URIBuilder(httpGet.getURI().toString() + "?" + param).build());
		}catch(Exception e){
			e.printStackTrace();
		}
		return sendHttpGet(httpGet);
	}
GET请求的多个参数以NameValuePair类型存储在List列表中。通过EntityUtils类将NameValuePair解析成String变量param,然后再使用URIBuilder类重新构造一个带参数的HTTP GET 请求。


三,发送POST请求

1,无参数的POST请求

public String doPost(String uri){
		HttpPost httpPost = new HttpPost(uri);
		return sendHttpPost(httpPost);
	}

2,带一个参数的POST请求

	public String doGet(String uri, String paramName, String paramValue){
		HttpGet httpGet = new HttpGet(uri);
		//build get uri with params
		URIBuilder uriBuilder = new URIBuilder(httpGet.getURI()).setParameter(paramName, paramValue);
		try{
			httpGet.setURI(uriBuilder.build());
		}catch(URISyntaxException e){
			e.printStackTrace();
		}
		return sendHttpGet(httpGet);
	}
使用URIBuilder的 setParameter方法为POST URI添加请求参数。当需要带多个参数的POST请求时,可借助Lists,参考上面“带多个参数的GET请求”的实现方式。

3,使用POST请求发送XML内容实体。

public String doPost(String uri, String reqXml){
		HttpPost httpPost = new HttpPost(uri);
		httpPost.addHeader("Content-Type", "application/xml");
		StringEntity entity = null;
		try{
			entity = new StringEntity(reqXml, "UTF-8");
		}catch(Exception e){
			e.printStackTrace();
		}
		
		httpPost.setEntity(entity);//http post with xml data
		return sendHttpPost(httpPost);
	}
XML内容实体以 String reqXml参数表示。首先为请求添加Header表示内容实体的类型-"application/xml",然后使用StringEntity类包装内容实体。最后调用HttpPost的setEntity()封装内容实体,并发送。


三,与服务器建立HTTP连接

1,建立GET连接

private String sendHttpGet(HttpGet httpGet){
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse response = null;
		HttpEntity entity = null;
		String responseContent = null;
		try{
			httpClient = HttpClients.createDefault();
//			httpGet.setConfig(config);
			response = httpClient.execute(httpGet);
			entity = response.getEntity();
			responseContent = EntityUtils.toString(entity, "UTF-8");
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				if(response != null)
					response.close();
				if(httpClient != null)
					httpClient.close();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
		return responseContent;
	}
HttpEntity entity 是服务器发回的响应实体,由EntityUtils类的toString()方法 转换字符串后,返回给调用者。

建立POST连接和PUT连接,参考整个完整代码:

package http;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
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.HttpPut;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

public class HttpRequest {
	
	private static HttpRequest httpRequest = null;
	private HttpRequest(){}
	public static HttpRequest getInstance(){
		if(httpRequest == null){
			synchronized (HttpRequest.class) {
				if(httpRequest == null)
					httpRequest = new HttpRequest();
			}
		}
		return httpRequest;
	}
	
	
	public String doGet(String uri){
		HttpGet httpGet = new HttpGet(uri);
		return sendHttpGet(httpGet);
	}
	
	/*
	 * only one paramter's http get request
	 */
	public String doGet(String uri, String paramName, String paramValue){
		HttpGet httpGet = new HttpGet(uri);
		//build get uri with params
		URIBuilder uriBuilder = new URIBuilder(httpGet.getURI()).setParameter(paramName, paramValue);
		try{
			httpGet.setURI(uriBuilder.build());
		}catch(URISyntaxException e){
			e.printStackTrace();
		}
		return sendHttpGet(httpGet);
	}

	/*
	 * mulitple paramters of http get request
	 */
	public String doGet(String uri, List parameters){
		HttpGet httpGet = new HttpGet(uri);
		String param = null;
		try{
			param = EntityUtils.toString(new UrlEncodedFormEntity(parameters));
			//build get uri with params
			httpGet.setURI(new URIBuilder(httpGet.getURI().toString() + "?" + param).build());
		}catch(Exception e){
			e.printStackTrace();
		}
		return sendHttpGet(httpGet);
	}
	
	
	public String doPost(String uri){
		HttpPost httpPost = new HttpPost(uri);
		return sendHttpPost(httpPost);
	}
	
	public String doPost(String uri, String reqXml){
		HttpPost httpPost = new HttpPost(uri);
		httpPost.addHeader("Content-Type", "application/xml");
		StringEntity entity = null;
		try{
			entity = new StringEntity(reqXml, "UTF-8");
		}catch(Exception e){
			e.printStackTrace();
		}
		
		httpPost.setEntity(entity);//http post with xml data
		return sendHttpPost(httpPost);
	}
	
	
	/*
	 * multiple http put params
	 */
	public String doPut(String uri, List parameters){
		HttpPut httpPut = new HttpPut(uri);
		String param = null;
		try{
			param = EntityUtils.toString(new UrlEncodedFormEntity(parameters));
			httpPut.setURI(new URIBuilder(httpPut.getURI().toString() + "?" + param).build());
		}catch(Exception e){
			e.printStackTrace();
		}
		return sendHttpPut(httpPut);
	}
	
	
	public String doPut(String uri, List parameters, String reqXml){
		HttpPut httpPut = new HttpPut(uri);
		String param = null;
		try{
			param = EntityUtils.toString(new UrlEncodedFormEntity(parameters));
			httpPut.setURI(new URIBuilder(httpPut.getURI().toString() + "?" + param).build());
		}catch(Exception e){
			e.printStackTrace();
		}
		
		StringEntity entity = null;
		try{
			entity = new StringEntity(reqXml, "UTF-8");
		}catch(Exception e){
			e.printStackTrace();
		}
		httpPut.setEntity(entity);
		
		return sendHttpPut(httpPut);
	}
	
	private String sendHttpPost(HttpPost httpPost){
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse response = null;
		HttpEntity entity = null;
		String responseContent = null;
		try{
			httpClient = HttpClients.createDefault();
//			httpPost.setConfig(config);
			response = httpClient.execute(httpPost);
			entity = response.getEntity();
			responseContent = EntityUtils.toString(entity, "UTF-8");
		}catch (Exception e) {
			e.printStackTrace();
		}finally{
			try{
				if(response != null)
					response.close();
				if(httpClient !=null)
					httpClient.close();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
		
		return responseContent;
	}
	
	private String sendHttpGet(HttpGet httpGet){
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse response = null;
		HttpEntity entity = null;
		String responseContent = null;
		try{
			httpClient = HttpClients.createDefault();
//			httpGet.setConfig(config);
			response = httpClient.execute(httpGet);
			entity = response.getEntity();
			responseContent = EntityUtils.toString(entity, "UTF-8");
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				if(response != null)
					response.close();
				if(httpClient != null)
					httpClient.close();
			}catch(IOException e){
				e.printStackTrace();
			}
		}
		return responseContent;
	}
	
	
	private String sendHttpPut(HttpPut httpPut){
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse response = null;
		HttpEntity entity = null;
		String responseContent = null;
		try{
			httpClient = HttpClients.createDefault();
//			httpPut.setConfig(config);
			response = httpClient.execute(httpPut);
			entity = response.getEntity();
			responseContent = EntityUtils.toString(entity, "UTF-8");
		}catch(Exception e){
			e.printStackTrace();
		}
		return responseContent;
	}
}

参考:http://tzz6.iteye.com/blog/2224757

http://blog.csdn.net/sunny243788557/article/details/8106265












你可能感兴趣的:(JAVA)