`
frank-liu
  • 浏览: 1661494 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java HttpClient学习总结:基本http操作

阅读更多

简介

     最近在做一些开放接口应用的时候发现原有的一些应用大量使用了HttpComponent里面的功能。从HttpComponent本身的介绍来说,它是一个实现Http协议很多操作功能的组件,在一些爬虫和网络应用开发中都得到大量的应用。因为牵涉到的开放服务接口使用的是http rest服务,感觉httpcomponent很适合其中的场景。这里结合项目中使用的一些场景来对其中的功能做一个简单的总结。

HttpClient基本操作

     在使用httpclient之前我们需要首先下载httpclient的jar包,里面就包含了httpclient.jar, httpcore.jar等几个文件。我们先看一个简单的示例:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;


public class HTTPGetSample {
    public static void main(String[] args) throws ClientProtocolException, IOException {
        String url = "http://www.google.com.hk/search?q=httpClient";
		
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);
		
        HttpResponse response = client.execute(request);
        System.out.println("Response Code: " +
	    response.getStatusLine().getStatusCode());
		
        BufferedReader rd = new BufferedReader(
            new InputStreamReader(response.getEntity().getContent()));
        String line = "";
        while((line = rd.readLine()) != null) {
	    System.out.println(line);
        }
    }
}

     在这个示例里我们尝试用httpclient发送一个http get请求。请求的地址是对应到一个google search的url.仔细看上面的代码,其实还是很简单,首先创建一个HttpClient的对象,然后针对我们的http get操作创建一个HttpGet对象,并将请求url作为参数传给该对象。具体执行get操作的步骤是通过httpclient.execute()方法。这个方法里将HttpGet对象作为参数传入。返回一个HttpResponse的结果。

    我们通过读取HttpResponse的结果就可以得到请求返回的详细信息。这个过程和我们通过浏览器浏览某个网页的效果相同。程序执行的部分结果如下:

Response Code: 200
<!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">...

    由于篇幅限制,省略了部分结果。

    从前面示例里我们可以看到通过HttpClient发送Http请求的基本套路:

1. 创建HttpClient对象。

2. 构造Http 请求对象。

3. 执行HttpClient对象的execute方法,将Http请求对象作为该方法的参数。

4. 读取execute方法返回的HttpResponse结果并解析。

    ok,既然整体过程是这样的话,我们后续使用post, put, delete等操作的过程也就大同小异了。在详细讨论这些方法使用之前我们先简单的讨论一下http协议里的这几种方法。

Http协议常用方法

     关于http协议的介绍网上材料很多。总的来说,http协议规范了通信双方交互的方式,基本上它是采用一种请求-应答的方式。客户端发送请求给服务器端,然后服务器端发送响应回来。我们常用的几种http操作的方法可以分为可修改的和不可修改的。怎么理解这个可修改和不可修改的意思呢?

    在http协议里,我们有的请求方法只是获取服务器端资源的信息,默认的假定是不修改服务器端的状态,这种方法称为不可修改的方法。比如说HttpGet, HttpHead, HttpOptions,HttpTrace。所以说这种请求方法是可以重复执行并返回相同结果的。我们对同一个资源执行若干次get操作,每次得到的结果都相同。而对于可修改的请求来说,主要有HttpPut, HttpPost, HttpDelete等。他们在规范里分别对应着对资源的update, create和delete等操作。所以在一些web应用里,我们提交表单的时候选择的是http post操作。

     除了http协议里规定的这么几种方法,它本身还支持交互的内容,比如通过请求头中间设定"accept", "Content-Type"等信息,指定我们交互的内容格式。他们可以是静态文件类型的,比如说txt, .gif,.jpg等,也可以是一些其他文本如json, xml。在一些rest web服务里面,我们指定的支持json或者xml格式的数据交换就可以通过这里来定义。

     我们刚看到了通过设定请求头来指定通信的交互内容格式,那么是否也可以指定请求体呢?在这里是有可能的,只是针对不同的请求方法。比如说对HttpGet之类的方法,他们本身只是获取服务器的内容不需要向服务器提交额外的信息,所以对于这一类的请求方法来说带个请求体意义并不大。而对于那些要提交大量内容给服务器的请求如上传文件或者提交表单信息的httpput, httppost请求,他们就有必要设置一个请求体。

    有了前面的这些铺垫,我们后面可以更加深入的分析一下httpclient中间几种方法的结构和用法。

 Http操作方法结构

    HttpClient相关的uml结构图如下:

 

    我们关注的各种http方法都被定义成一个个独立的类,他们都继承自HttpRequestBase。其中比较特殊一点的是HttpPut, HttpPost,他们继承自HttpEntityEnclosingRequestBase。为什么这两个类要稍微特殊一点呢?这就是我们前面提到的他们要设置请求体,在HttpEntityEnclosingRequestBase里有HttpEntity的成员变量,他们作为这两个方法特定的特性定义在这里:

private HttpEntity entity;

public HttpEntity getEntity() {
    return this.entity;
}

public void setEntity(final HttpEntity entity) {
    this.entity = entity;
}

     HttpEntity是一个接口,根据具体传入的参数类型我们可以选择StringEntity, InputStreamEntity等。由此,对于这两种有差别的请求方法来说,他们只是需要多增加一个setEntity的方法。

    另外对于通用的设置请求头部分,前面的示例代码里我们是使用了一种硬编码的方式。我们也可以采用request.addHeader(Header)的方法。在HttpClient里,Header是一个接口,我们可以创建两种实现该接口的对象来作为参数传给addHeader方法。分别是BasicHeader, BufferedHeader。

 

总结

     HttpClient通常用来作为一个模拟http请求的工具。我们最常见的get, put, post, delete等方法在其中都通过具体定义的类来实现。当我们要发送某个具体的请求是,只需要创建对应请求的对象并设定请求头或者请求体,执行HttpClient的execute方法就可以得到执行结果了。返回的HttpResponse消息体结果具体内容是一个InputStream,我们可以根据需要来读取内容。返回的消息头则是显示http操作方法的执行结果,我们可以根据消息头来判断请求执行是否正确,结果是否执行完毕以及如果出错了错误的缘由可能是什么等信息。关于HttpClient的更多实现和应用后面会进一步学习研究。

参考材料

HttpComponent website

  • 大小: 51.6 KB
  • 大小: 9 KB
分享到:
评论
1 楼 frank-liu 2014-05-05  
yaerfeng1989 写道
可以参考代码:java apache commons HttpClient发送get和post请求的学习整理,下载地址:http://www.zuidaima.com/share/1754065983409152.htm

他这边贴出来的代码有点老了,新的httpcomponent的api有不少更新,不过整体的思路都差不多。

相关推荐

Global site tag (gtag.js) - Google Analytics