java http包_Java网络编程:利用apache的HttpClient包进行http操作

本文详述了如何利用Apache HttpClient库进行HTTP的GET和POST操作,包括封装HttpClient类的方法,处理重定向、登录请求及Cookie管理。示例代码展示了简单的GET、POST操作以及处理重定向和鉴权的场景。
摘要由CSDN通过智能技术生成

本文介绍如何利用apache的HttpClient包进行http操作,包括get操作和post操作。

一、下面的代码是对HttpClient包的封装,以便于更好的编写应用代码。

importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.HashMap;importjava.util.Map;importorg.apache.commons.httpclient.Cookie;importorg.apache.commons.httpclient.Header;importorg.apache.commons.httpclient.HttpClient;importorg.apache.commons.httpclient.HttpMethod;importorg.apache.commons.httpclient.HttpStatus;importorg.apache.commons.httpclient.NameValuePair;importorg.apache.commons.httpclient.cookie.CookiePolicy;importorg.apache.commons.httpclient.methods.GetMethod;importorg.apache.commons.httpclient.methods.PostMethod;importorg.apache.commons.httpclient.params.HttpMethodParams;importorg.apache.commons.httpclient.util.URIUtil;importorg.apache.commons.lang.StringUtils;public classMyHttpClient {privateHttpClient httpClient;privateString cookies;publicMyHttpClient(String ip) {this(ip, 80);

}public MyHttpClient(String ip, intport) {

httpClient= newHttpClient();

httpClient.getHostConfiguration().setHost(ip, port,"http");

httpClient.getParams().setCookiePolicy(

CookiePolicy.BROWSER_COMPATIBILITY);

}publicString getCookies(){returncookies;

}public voidsetCookies(String cookies){this.cookies =cookies;

}public String doGet(String url) throwsIOException{return doGet(url,null);

}public String doGet(String url, String paras) throwsIOException {

GetMethod method= newGetMethod(url);if(StringUtils.isNotBlank(paras)) {

method.setQueryString(URIUtil.encodeQuery(paras));

}returnsendRequest(method);

}public String doPost(String url) throwsIOException{return doPost(url,new HashMap());

}public String doPost(String url, String paras) throwsIOException {

Map paraMap = new HashMap();

String[] values= paras.split("&");for(String value:values){

String[] item= value.split("=");if(item.length==2){

paraMap.put(item[0].trim(), item[1].trim());

}

}returndoPost(url,paraMap);

}public String doPost(String url, Map paras) throwsIOException{int index=0;

NameValuePair[] data= newNameValuePair[paras.size()];for(Map.Entryentry:paras.entrySet()){

data[index++] = newNameValuePair(entry.getKey(),entry.getValue());

}returndoPost(url,data);

}private String doPost(String url, NameValuePair[] data) throwsIOException{

PostMethod method= newPostMethod(url);

method.setRequestBody(data);

method.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"utf-8");returnsendRequest(method);

}private String sendRequest(HttpMethod method) throwsIOException{

StringBuffer response= newStringBuffer();try{

method.setRequestHeader("Cookie", cookies);

httpClient.executeMethod(method);if (method.getStatusCode() ==HttpStatus.SC_OK) {

response.append(getResponseBody(method));

}else if(method.getStatusCode() ==HttpStatus.SC_MOVED_TEMPORARILY){//302 重定向

response.append(getResponseHeader(method));

}else{

System.out.println("response statuscode : "

+method.getStatusCode());throw new IllegalStateException("response statuscode : "

+method.getStatusCode());

}

fetchCookies();

}finally{

method.releaseConnection();

}returnresponse.toString();

}private voidfetchCookies(){

Cookie[] values=httpClient.getState().getCookies();

StringBuffer cookieBuffer= newStringBuffer();for(Cookie c : values)

{

cookieBuffer.append(c.toString()).append(";");

}

cookies=cookieBuffer.toString();

}private String getResponseBody(HttpMethod method) throwsIOException, IOException {

StringBuffer response= newStringBuffer();

BufferedReader reader= null;try{

reader= new BufferedReader(newInputStreamReader(

method.getResponseBodyAsStream(),"UTF-8"));

String line;while ((line = reader.readLine()) != null) {

response.append(line).append(

System.getProperty("line.separator"));

}

}finally{if (reader != null) {try{

reader.close();

}catch(IOException e) {

}

}

}returnresponse.toString();

}privateString getResponseHeader(HttpMethod method){

StringBuffer response= newStringBuffer();

Header[] headers=method.getResponseHeaders();for(Header header:headers){

String line= header.getName()+" : "+header.getValue();

response.append(line);

response.append(System.getProperty("line.separator"));

}returnresponse.toString();

}

}

说明:上面代码中doGet方法中的 语句 String encodeQuery = URIUtil.encodeQuery(paras);

存在一点问题,当url部门有特殊字符,如空格、+ 号等,这些字符需要被编码。

这时需要换成 String encodeQuery = URIUtil.encodePath(paras); 语句,即用encodePath方法替代encodeQuery方法。

二、下面来进行实际的使用举例

1、简单的get操作

下面的代码完成对一个url的get操作。我们封装了两个doGet操作,一个是带参数的,一个是不带参数的。待参数的参数格式如 name1=value1&name2=value2

MyHttpClient httpClient = new MyHttpClient("xxxx");  //xxxx是web服务器的地址

String result = httpClient.doGet(url);  //url是请求的url地址

System.out.println(result);

2、简单的post操作

下面的代码完成对一个url的post操作.

MyHttpClient httpClient = new MyHttpClient("localhost");

Map paras = new HashMap();

paras.put("para1", "value1");

paras.put("para2", "value2");

String result=httpClient.doPost(url,paras);

System.out.println(result);

3、有重定向的get操作

如果发起的一个get操作,被服务器重定向到一个新的url。这时我们封装的doGet操作返回的是新的url(重定向后的)对应的信息。

4、有重定向的post操作

如果发起的一个post操作,被服务器重定向到一个新的url。我们封装的doPost操作,与doGet操作返回的结果不同,doPost是返回重定向头信息,而不是新的url的信息。如返回如下的信息,其中Location对应的值login就是重定向的url

Server : Apache-Coyote/1.1

Set-Cookie : JSESSIONID=8115A882086E7F27809FDF24213F82F5; Path=/boot/; HttpOnly

Set-Cookie :Expires=Thu, 01-Jan-1970 00:00:10 GMT

Location : login

Content-Length : 0

Date : Sat, 09 Jan 2016 07:41:21 GMT

5、需要登录的请求

有的web服务器有鉴权功能,当发起一个请求时,如果在该请求之前还没有登录,会自动重定向到登录页面,登录成功后才会跳转到想要请求的页面。

这时代码应该这样写:

MyHttpClient httpClient = new MyHttpClient("localhost");//下面是登录请求

httpClient.doPost(loginUrl,"username=xxx&password=yyy");//因为前面已经登录,下面的url将不会发生重定向。而是返回该url对应页面的本身信息。

String result =httpClient.doGet(url);

System.out.println(result);

6、与cookie有关的请求

有的web应用中,用到了cookie。所谓的cookie,就是希望浏览器操作关闭后,会在浏览器本地客户端机器上记录下一些信息。当下次打开浏览器,操作相关的页面后,这些信息能被带到服务器。我们封装的这个功能对此也支持。具体通过例子说明:

MyHttpClient httpClient = new MyHttpClient("localhost");//下面的操作,会产生cookie

httpClient.doPost(url,paras);//获取本次会话产生的cookie

String cookies =httpClient.getCookies();//开启一个新的会话

MyHttpClient otherHttpClient = new MyHttpClient("localhost");//将上次会话的cookie设置到本次会话中,以便于cookie能带到服务器

otherHttpClient.setCookies(cookies);//这次请求就会上个会话产生的cookie带到服务器

String result =otherHttpClient.doGet(otherUrl);

System.out.println(result);

三、小结

我们封装的这个httpclient类,可以很方便的完成http请求的一些基本操作。并且对有鉴权控制、cookie功能的网站也能较好的满足。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值