在项目中使用到HttpClient,也尝试使用了HttpURLConnection。写成一个工具类,方便以后调用,同时也作为两者
使用的对比。
NetUtil
package org.base.common.net;
import java.io.BufferedReader;
import java.io.DataOutputStream;
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.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
/**
* HttpClient与HttpURLConnection使用实例
* @author lushuaiyin
*
*/
public class NetUtil {
private static String METHOD_TYPE_GET="GET";
private static String METHOD_TYPE_POST="POST";
public static String requestByHttpURLConnection(String protocol,String host,int port,String action,Map paramsMap,String methodType){
String result="";
String url="";
String urlParam="";
if(protocol==null||protocol.trim().equals("")){
protocol="http";
}
if(host==null||host.trim().equals("")||action==null||action.trim().equals("")){
System.out.println("客户端----url 参数不完整,请检查传参!");
}else{
if(action.startsWith("/")){
action=action.substring(1);
}
url+=protocol+"://"+host.trim()+":"+String.valueOf(port)+"/"+action.trim();
//参数
if(paramsMap==null||paramsMap.size()<=0){
}else{
int i=0;
for(Iterator it=paramsMap.keySet().iterator();it.hasNext();i++){
String key=(String)it.next();
String value=(String)paramsMap.get(key);
try {
if(i==0){
urlParam+="?"+key+"="+URLEncoder.encode(value, "UTF-8");
}else{
urlParam+="&"+key+"="+URLEncoder.encode(value, "UTF-8");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
OutputStream os=null;
InputStream is=null;;
InputStreamReader isr=null;;
BufferedReader br=null;
try{
if(methodType==null||methodType.trim().equals("")){
methodType=NetUtil.METHOD_TYPE_GET;
url+=urlParam;
}else if(methodType.trim().equals(NetUtil.METHOD_TYPE_GET)){
methodType=NetUtil.METHOD_TYPE_GET;
url+=urlParam;
}else if(methodType.trim().equals(NetUtil.METHOD_TYPE_POST)){//post请求
methodType=NetUtil.METHOD_TYPE_POST;
}else{
methodType=NetUtil.METHOD_TYPE_GET;
url+=urlParam;
}
URL requestUrl=new URL(url);
HttpURLConnection connect=(HttpURLConnection)requestUrl.openConnection();
System.out.println("客户端----请求url:"+url);
connect.setDoInput(true);//是否可读
connect.setDoOutput(true);//是否可写
connect.setRequestMethod(methodType);
connect.setUseCaches(false);//是否用缓存
connect.setRequestProperty("Content-Type", "text/plain");
connect.setRequestProperty("Accept-Charset", "UTF-8");
connect.setConnectTimeout(60*1000);
connect.setReadTimeout(60*1000);
connect.connect();
//post与get请求发送方式不同,参数是通过OutputStream发送
if(methodType.trim().equals(NetUtil.METHOD_TYPE_POST)){
// DataOutputStream out = new DataOutputStream(connect
// .getOutputStream());
// String aa="?myhobby=assssss";
// out.writeBytes(aa);
os=connect.getOutputStream();
os.write(urlParam.getBytes("UTF-8"));
os.flush();
os.close();
}
//读取返回信息
if(connect.getInputStream()!=null){
is=connect.getInputStream();
isr=new InputStreamReader(is);
br=new BufferedReader(isr);
StringBuffer buf=new StringBuffer("");
String temp="";
while((temp=br.readLine())!=null){
buf.append(temp);
}
result=buf.toString();
}else{
System.out.println("客户端----返回流为空");
}
}catch(Exception e){
result="客户端----请求异常,请联系管理员。";
e.printStackTrace();
}finally{
try{
if(br!=null){
br.close();
}
if(isr!=null){
isr.close();
}
if(is!=null){
is.close();
}
if(os!=null){
os.close();
}
}catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("客户端----httpURLConnection使用方法:"+methodType+",并收到响应信息如下:");
System.out.println(result);
return result;
}
//
public static String requestByHttpClient(String protocol,String host,int port,String action,Map paramsMap,String methodType){
String result="";
if(protocol==null||protocol.trim().equals("")){
protocol="http";
}
if(methodType==null||methodType.trim().equals("")){
methodType=NetUtil.METHOD_TYPE_GET;
}else if(methodType.trim().equals(NetUtil.METHOD_TYPE_GET)){
methodType=NetUtil.METHOD_TYPE_GET;
}else if(methodType.trim().equals(NetUtil.METHOD_TYPE_POST)){//post请求
methodType=NetUtil.METHOD_TYPE_POST;
}else{
methodType=NetUtil.METHOD_TYPE_GET;
}
if(action.startsWith("/")){
action=action.substring(1);
}
//参数
NameValuePair[] params=null;
String urlParam="";
if(paramsMap==null||paramsMap.size()<=0){
}else{
params=new NameValuePair[paramsMap.size()];
int i=0;
for(Iterator it=paramsMap.keySet().iterator();it.hasNext();i++){
String key=(String)it.next();
String value=(String)paramsMap.get(key);
NameValuePair pa=null;
try {
pa = new NameValuePair(key,URLEncoder.encode(value, "UTF-8"));
if(i==0){
urlParam+="?"+key+"="+URLEncoder.encode(value, "UTF-8");
}else{
urlParam+="&"+key+"="+URLEncoder.encode(value, "UTF-8");;
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
params[i]=pa;
}
}
HttpClient http=new HttpClient();
GetMethod getMethod=null;
PostMethod postMethod=null;
String url=protocol+"://"+host+":"+String.valueOf(port)+"/"+action+urlParam;
System.out.println("客户端----请求url:"+url);
http.getHostConfiguration().setHost(host, port, protocol);
if(methodType==NetUtil.METHOD_TYPE_GET){
getMethod=new GetMethod("/"+action);
getMethod.setRequestHeader("Content-type", "text/plain;charset=UTF-8");
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
if(params!=null){
getMethod.setQueryString(params);
}
}else{
postMethod=new PostMethod("/"+action);
postMethod.setRequestHeader("Content-type", "text/plain;charset=UTF-8");
//参数
if(params!=null){
postMethod.setRequestBody(params);
}
}//end post
try {
if(methodType==NetUtil.METHOD_TYPE_GET){
int ret=http.executeMethod(getMethod);
}else{
int ret=http.executeMethod(postMethod);
}
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
InputStream is=null;
InputStreamReader isr=null;
BufferedReader br=null;
StringBuffer buf=new StringBuffer("");
try{
if(methodType==NetUtil.METHOD_TYPE_GET){
if(getMethod.getResponseBodyAsStream()!=null){
is=getMethod.getResponseBodyAsStream();
}
}else{
if(postMethod.getResponseBodyAsStream()!=null){
is=postMethod.getResponseBodyAsStream();
}
}
isr=new InputStreamReader(is,"UTF-8");
br=new BufferedReader(isr);
String temp=null;
while((temp=br.readLine())!=null){
buf.append(temp);
}
result=buf.toString();
}catch(IOException e){
result="客户端----请求异常,请联系管理员。";
e.printStackTrace();
}finally{
try{
if(br!=null){
br.close();
}
if(isr!=null){
isr.close();
}
if(is!=null){
is.close();
}
if(postMethod!=null){
postMethod.releaseConnection();
}
}catch(IOException e){
e.printStackTrace();
}
}
System.out.println("客户端----httpclient使用方法:"+methodType+",并收到响应信息如下:");
System.out.println(result);
return result;
}
public static void main(String[] dsd){
String protocol="http";
// String host="10.55.15.43";
String host="118.198.140.203";
int port=8080;
String action="/frame/servlet/TestServlet";
Map paramsMap=new HashMap();
paramsMap.put("myname", "lushuaiyin");
paramsMap.put("myhobby", "onepiece");
NetUtil.requestByHttpURLConnection(protocol, host, port, action, paramsMap, NetUtil.METHOD_TYPE_GET);
// NetUtil.requestByHttpURLConnection(protocol, host, port, action, paramsMap, NetUtil.METHOD_TYPE_POST);
// NetUtil.requestByHttpClient(protocol, host, port, action, paramsMap, NetUtil.METHOD_TYPE_GET);
// NetUtil.requestByHttpClient(protocol, host, port, action, paramsMap, NetUtil.METHOD_TYPE_POST);
}
}
写个servlet作为服务端的测试代码,TestServlet
package org.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void init(){
System.out.println(" TestServlet init---");
}
public void destroy() {
System.out.println(" TestServlet destroy---");
super.destroy();
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//编码设置,防止乱码。
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/plain;chatset=utf-8");
response.setCharacterEncoding("UTF-8");
PrintWriter pw=response.getWriter();
System.out.println("服务端~~~~doGet here is TestServlet");
String pares="";
if(request.getParameterMap()!=null&&request.getParameterMap().size()>0){
int i=0;
for(Iterator it=(Iterator)request.getParameterMap().keySet().iterator();it.hasNext();i++){
String key=(String)it.next();
String[] values=(String[])request.getParameterMap().get(key);
String value=values[0];//request的参数map值是数组,即可一对多,这里认为一个参数名对应一个参数值
value=URLDecoder.decode(value, "UTF-8");
if(i==request.getParameterMap().size()-1){
pares+="key:"+key+",value:"+value+".";
}else{
pares+="key:"+key+",value:"+value+";";
}
}
System.out.println("服务端~~~~doGet方法获取传参--"+pares);
}else{
System.out.println("服务端~~~~doGet方法没有获取到传参...");
}
//往客户端回写数据
pw.println("来自服务端~~~~doGet方法获取传参--"+pares+"\r\n");
//或使用write方法
// pw.write("来自服务端~~~~doGet方法获取传参--"+pares+"\r\n1111111111");
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
pw.println("来自服务端~~~~doGet方法获取传参时间--"+sdf.format(new Date())+"\r\n");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//编码设置,防止乱码。
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/plain;chatset=utf-8");
response.setCharacterEncoding("UTF-8");
PrintWriter pw=response.getWriter();
System.out.println("服务端~~~~doPost here is TestServlet");
String pares="";
String paramResult="";
InputStream is=null;;
InputStreamReader isr=null;;
BufferedReader br=null;
StringBuffer buf=new StringBuffer("");
try{
is=request.getInputStream();
isr=new InputStreamReader(is);
br=new BufferedReader(isr);
String temp="";
while((temp=br.readLine())!=null){
buf.append(temp);
}
if(buf.toString()!=null&&!buf.toString().trim().equals("")){
pares=buf.toString();
String[] paresArr=pares.split("&");
if(paresArr!=null&&paresArr.length>0){
for(int i=0;i<paresArr.length;i++){
String pam=paresArr[i];
if(pam.startsWith("?")){
pam=pam.substring(1);
}
String[] realpam=pam.split("=");
if(realpam!=null&&realpam.length==2){
String paramKey=realpam[0];
String paramValue=realpam[1];
if(i==paresArr.length-1){
paramResult+="key:"+paramKey+",value:"+paramValue+".";
}else{
paramResult+="key:"+paramKey+",value:"+paramValue+";";
}
}
}
}
System.out.println("服务端~~~~doPost方法获取传参--"+paramResult);
}else{
System.out.println("服务端~~~~doPost方法没有获取到传参...");
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(br!=null){
br.close();
}
if(isr!=null){
isr.close();
}
if(is!=null){
is.close();
}
}catch (IOException e) {
e.printStackTrace();
}
//往客户端回写数据
pw.println("来自服务端~~~~doPost方法获取传参--"+paramResult);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
pw.println("来自服务端~~~~doPost方法获取传参时间--"+sdf.format(new Date()));
}
}
}
web.xml访问配置:
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>org.test.TestServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/servlet/TestServlet</url-pattern>
</servlet-mapping>
以下是测试打印结果:
requestByHttpClient POST
----------------------------------------
服务端打印:
服务端~~~~doPost here is TestServlet
服务端~~~~doPost方法获取传参--key:myhobby,value:onepiece;key:myname,value:lushuaiyin.
客户端打印:
log4j:WARN No appenders could be found for logger (org.apache.commons.httpclient.HttpClient).
log4j:WARN Please initialize the log4j system properly.
客户端----请求url:http://118.198.140.203:8080/frame/servlet/TestServlet?myhobby=onepiece&myname=lushuaiyin
客户端----httpclient使用方法:POST,并收到响应信息如下:
来自服务端~~~~doPost方法获取传参--key:myhobby,value:onepiece;key:myname,value:lushuaiyin.来自服务端~~~~doPost方法获取传参时间--2013-05-01 12:28:01
requestByHttpClient GET
-------------------------------------
服务端打印:
服务端~~~~doGet here is TestServlet
服务端~~~~doGet方法获取传参--key:myhobby,value:onepiece;key:myname,value:lushuaiyin.
客户端打印:
log4j:WARN No appenders could be found for logger (org.apache.commons.httpclient.HttpClient).
log4j:WARN Please initialize the log4j system properly.
客户端----请求url:http://118.198.140.203:8080/frame/servlet/TestServlet?myhobby=onepiece&myname=lushuaiyin
客户端----httpclient使用方法:GET,并收到响应信息如下:
来自服务端~~~~doGet方法获取传参--key:myhobby,value:onepiece;key:myname,value:lushuaiyin.来自服务端~~~~doGet方法获取传参时间--2013-05-01 12:29:00
########################################################################
requestByHttpURLConnection POST
-------------------------------------
服务端打印:
服务端~~~~doPost here is TestServlet
服务端~~~~doPost方法获取传参--key:myhobby,value:onepiece;key:myname,value:lushuaiyin.
客户端打印:
客户端----请求url:http://118.198.140.203:8080/frame/servlet/TestServlet
客户端----httpURLConnection使用方法:POST,并收到响应信息如下:
来自服务端~~~~doPost方法获取传参--key:myhobby,value:onepiece;key:myname,value:lushuaiyin.来自服务端~~~~doPost方法获取传参时间--2013-05-01 12:30:04
requestByHttpURLConnection GET
-------------------------------------
服务端打印:
服务端~~~~doGet here is TestServlet
服务端~~~~doGet方法获取传参--key:myhobby,value:onepiece;key:myname,value:lushuaiyin.
客户端打印:
客户端----请求url:http://118.198.140.203:8080/frame/servlet/TestServlet?myhobby=onepiece&myname=lushuaiyin
客户端----httpURLConnection使用方法:GET,并收到响应信息如下:
来自服务端~~~~doGet方法获取传参--key:myhobby,value:onepiece;key:myname,value:lushuaiyin.来自服务端~~~~doGet方法获取传参时间--2013-05-01 12:31:02