HttpClient发送get请求,post请求代码

使用Httpclient发送get,post等请求方式代码记录:
**友情提醒:**本文为个人工作实战记录,而非面面俱到的普及性文章,如有不适,还望谅解。
注意事项:

  1. 本文使用4.3版本以后的HttpClient,读者现在还会看到网上仍然有人发布HttpClient旧版本的使用文章,建议直接使用新版本。

首先先来一个简单的示例,该示例中的方式可能在实际项目中不会采用,但是却方便我们理解httpclient的使用方式:

	public static String doGet() {
		
		String result = "";
		InputStream inputStream = null;
		BufferedReader bufferedReader = null;
   	 	CloseableHttpClient client = HttpClients.createDefault();
        
   		 try {
		        URI uri = new URIBuilder()
	        			.setScheme("https")
		                .setHost("www.baidu.com")
		                .setParameter("app-key", "123456")
		                .build();		        
		        HttpGet httpGet = new HttpGet(uri);
		        CloseableHttpResponse response = null;	                       	
			response = client.execute(httpGet);
			
			URI testUri = httpGet.getURI();				
			System.out.println("params test " + testUri);				
		            System.out.println(response.getStatusLine().getStatusCode());		            
		            Header[] headers = response.getAllHeaders();
			System.out.println("response header " + headers.length);
	
			for(Header temp : headers){
				System.out.println("response header  " + temp.toString());
			}
					
	            HttpEntity entity = response.getEntity();
	            inputStream = entity.getContent();
	          
	            // 包装输入流
	            bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
	
	            StringBuffer sbf = new StringBuffer();
	            // 读取封装的输入流
	            String temp = null;
	            while ((temp = bufferedReader.readLine()) != null) {
	                sbf.append(temp).append("\r\n");
	            }
	
	            result = sbf.toString();
	            return result;
          
		} catch (URISyntaxException | IOException e) {
			e.printStackTrace();
		} finally{
	            // 关闭资源
	            if (null != bufferedReader) {
	                try {
	                	bufferedReader.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if (null != inputStream) {
	                try {
	                	inputStream.close();
	                } catch (IOException e) {
	                    e.printStackTrace();
	                }
	            }
	            if(null != response) {
		             response.close();
				}
			}
	        return null;
	}

接下来我们开始讲解如何在实际项目中写出支持高并发的httpclient使用代码,下面的代码是真正的开发代码,对整个代码结构都进行了个人编码风格上的封装:

  • 1.首先初始化连接池:
private static void init() {
	if (cm == null) {
		cm = new PoolingHttpClientConnectionManager();
		cm.setMaxTotal(50);// 整个连接池最大连接数
		cm.setDefaultMaxPerRoute(5);// 每路由最大连接数,默认值是2
	}
}
  • 2.编写获取连接的方法:
private static CloseableHttpClient getHttpClient() {
	init();
	return HttpClients.custom().setConnectionManager(cm).build();
}

3.编写get,post请求方法:入参有url,请求头,参数集合,当然这个可以由你们自己控制代码结构。

public static String httpGetRequest(String url, Map<String, Object> headers, Map<String, Object> params) throws URISyntaxException{

	URIBuilder ub = assembleURL(url);

	if(null != params && !params.isEmpty()) {
		ArrayList<NameValuePair> pairs = covertParams2NVPS(params);
		ub.setParameters(pairs);
	}

	HttpGet httpGet = new HttpGet(ub.build());
		System.out.println("httpGet " +ub.build().toString());
		if(null != headers && !headers.isEmpty()) {
		for (Map.Entry<String, Object> param : headers.entrySet()) {
			httpGet.addHeader(param.getKey(), String.valueOf(param.getValue()));
		}
	}
	return getResult(httpGet);
}

public static String httpPostRequest(String url, Map<String, Object> headers, Map<String, Object> params) throws URISyntaxException, UnsupportedOperationException, IOException {

	URIBuilder ub = assembleURL(url);

	HttpPost httpPost = new HttpPost(ub.build());

	if(null != headers && !headers.isEmpty()) {
		for (Map.Entry<String, Object> param : headers.entrySet()) {
			httpPost.addHeader(param.getKey(), String.valueOf(param.getValue()));
		}
	}

	if(null != params && !params.isEmpty()) {
		ArrayList<NameValuePair> pairs = covertParams2NVPS(params); 
		httpPost.setEntity(new UrlEncodedFormEntity(pairs, UTF_8)); 
	}

	System.out.println("httpPost url " + httpPost.getURI());
	return getResult(httpPost);
}
/**
*封装url方法
*/
private static URIBuilder assembleURL(String url) {
	URIBuilder ub = new URIBuilder();
	ub.setScheme("http");
	ub.setHost("172.19.250.89");
	ub.setPort("8989");
	ub.setPath(url); 
	return ub;
}


4.发送http 请求并处理返回结果:

public static String getResult(HttpRequestBase request) {

	String result = "";
	InputStream inputStream = null;
	BufferedReader bufferedReader = null;
	CloseableHttpClient httpClient = getHttpClient();
	CloseableHttpResponse response = null;

	try{ 
		response = httpClient.execute(request); 
		System.out.println("--request result status--" + response.getStatusLine().toString());

		HttpEntity entity = response.getEntity();
		inputStream = entity.getContent(); 
		// 包装输入流
		bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
		StringBuffer sbf = new StringBuffer(); 
		// 读取封装的输入流
		String temp = null;
		while ((temp = bufferedReader.readLine()) != null) {
			sbf.append(temp).append("\r\n");
		}
		result = sbf.toString();
		return result;
	} catch (Exception e) {
		logger.error("httpclient request occur error",e);
	} finally {
			// 关闭资源
		if (null != bufferedReader) {
			try {
				bufferedReader.close();
			} catch (IOException e) {
				logger.error("IOException",e);;
			}
		}
		if (null != inputStream) {
			try {
				inputStream.close();
			} catch (IOException e) {
				logger.error("IOException",e);;
			}
		}
		if(null != response) {
			try {
				response.close();
				httpClient.close();
			} catch (IOException e) {
				logger.error("IOException",e);;
			}
		}
	} 
		return EMPTY_STR;
	} 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值