Java开源框架类库介绍(一)--HttpComponents
来源:互联网 发布:郑州掌沃软件科技 编辑:程序博客网 时间:2024/04/30 00:21
我们在开发过程中经常会使用到HTTP协议作为我们数据交换的协议,本小节主要介绍一个开源的HTTP组件的使用。
1. 环境配置
1.1 下载安装
HTTP Components是Apache的一个子项目,地址是:http://hc.apache.org/,主页中提供下载。使用过程及其简单,解压缩后直接将其lib目录下文件拷贝到classpath下即可。
1.2 使用Maven管理
如果您使用Maven管理你的项目,需要这样配置:
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>${httpcomponents.version}</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>${httpcomponents.version}</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>fluent-hc</artifactId><version>${httpcomponents.version}</version></dependency>
2. 示例代码
2.1 最简单的例子
最简单的例子当然是实现请求的处理,下面分别是GET和POST:
public void simpleGet() {HttpGet get = new HttpGet("http://www.baidu.com");try (CloseableHttpClient httpClient = new DefaultHttpClient();CloseableHttpResponse response = httpClient.execute(get);) {handleResponse(response);} catch (IOException e) {e.printStackTrace();}}
public void simplePost() {HttpPost post = new HttpPost("http://www.baidu.com");try (CloseableHttpClient httpClient = new DefaultHttpClient();CloseableHttpResponse response = httpClient.execute(post);) {handleResponse(response);} catch (IOException e) {e.printStackTrace();}}
注意我的代码使用了JDK 1.7的try语句块新特性,如果低于1.7版本请自行修改代码。
下面是处理响应的代码:
private void handleResponse(HttpResponse response) throws IOException {int statusCode = 0;if ((statusCode = response.getStatusLine().getStatusCode()) == 200) {HttpEntity entity = response.getEntity();System.out.println(entity.getContentType());System.out.println(entity.getContentEncoding());System.out.println(entity.getContentLength());try (InputStream ins = response.getEntity().getContent();) {BufferedReader reader = new BufferedReader(new InputStreamReader(ins));String str = null;while ((str = reader.readLine()) != null) {System.out.println(str);}}} else {System.out.println("------------http error: statusCode is: "+ statusCode);}}
2.2 增加URI方式
简单的一个请求我们可以处理,那么如果这个请求中需要包含参数呢?下面是代码:
public void simpleURIGet() throws URISyntaxException {URI uri = new URIBuilder().setScheme("http").setHost("www.google.com").setPath("/search").setParameter("q", "httpclient").setParameter("btnG", "Google Search").setParameter("aq", "f").setParameter("oq", "").build();HttpGet get = new HttpGet(uri);System.out.println(get.getURI());try (CloseableHttpClient httpClient = new DefaultHttpClient();CloseableHttpResponse response = httpClient.execute(get);) {handleResponse(response);} catch (IOException e) {e.printStackTrace();}}
public void simpleURIPost() throws URISyntaxException {URI uri = new URIBuilder().setScheme("http").setHost("www.google.com").setPath("/search").setParameter("q", "httpclient").setParameter("btnG", "Google Search").setParameter("aq", "f").setParameter("oq", "").build();HttpPost post = new HttpPost(uri);System.out.println(post.getURI());try (CloseableHttpClient httpClient = new DefaultHttpClient();CloseableHttpResponse response = httpClient.execute(post);) {handleResponse(response);} catch (IOException e) {e.printStackTrace();}}
对于POST,还可以这样:
public void simpleParamPost() throws UnsupportedEncodingException {HttpPost post = new HttpPost("http://www.baidu.com");List<NameValuePair> params = new ArrayList<>();params.add(new BasicNameValuePair("name", "zhangsan"));params.add(new BasicNameValuePair("password", "1234"));post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));try (CloseableHttpClient httpClient = new DefaultHttpClient();CloseableHttpResponse response = httpClient.execute(post);) {handleResponse(response);} catch (IOException e) {e.printStackTrace();}}
2.3 对于Header的处理
对于请求头的处理,诸如设置字段值:
public void addHeadersGet() throws UnsupportedEncodingException {HttpGet get = new HttpGet("http://www.baidu.com");get.setHeader("User-Agent","Ahopedog/5.0 (Linux NT 5.1; rv:5.0) Gecko/20100101 FireDog/5.0");get.setHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");List<NameValuePair> params = new ArrayList<>();params.add(new BasicNameValuePair("name", "zhangsan"));params.add(new BasicNameValuePair("password", "1234"));try (CloseableHttpClient httpClient = new DefaultHttpClient();CloseableHttpResponse response = httpClient.execute(get);) {handleResponse(response);} catch (IOException e) {e.printStackTrace();}}
public void addHeadersPost() throws UnsupportedEncodingException {HttpPost post = new HttpPost("http://www.baidu.com");post.setHeader("User-Agent","Ahopedog/5.0 (Linux NT 5.1; rv:5.0) Gecko/20100101 FireDog/5.0");post.setHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");List<NameValuePair> params = new ArrayList<>();params.add(new BasicNameValuePair("name", "zhangsan"));params.add(new BasicNameValuePair("password", "1234"));post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));try (CloseableHttpClient httpClient = new DefaultHttpClient();CloseableHttpResponse response = httpClient.execute(post);) {handleResponse(response);} catch (IOException e) {e.printStackTrace();}}
处理响应头的话基本原理差不多,代码是这样:
public void handlePostResponseHeader() throws UnsupportedEncodingException {HttpPost post = new HttpPost("http://www.baidu.com");try (CloseableHttpClient httpClient = new DefaultHttpClient();CloseableHttpResponse response = httpClient.execute(post);) {Header[] headers = response.getAllHeaders();for (Header h : headers) {System.out.println(h.getName() + " : " + h.getValue());}Header serverHeader = response.getFirstHeader("server");System.out.println(serverHeader.getName() + " : "+ serverHeader.getValue());} catch (IOException e) {e.printStackTrace();}}
通过以上代码可以看出,HTTP component能够帮我们省去复杂的HTTP协议的建立连接、处理等操作,框架封装了细节。
3. Fluent方式
以上工作做完了之后,HTTP component仍然觉得不满足,他们认为还可以提供给我们更简洁编写自己代码的方案,于是Fluent来了:
3.1 最简单的调用
GET和POST都差不多:
public void simpleGet() {Request request = Request.Get("http://www.baidu.com");handleContent(request);}
public void simplePost() {Request request = Request.Post("http://www.baidu.com");handleContent(request);}
处理代码:
private void handleContent(Request request) {Response response;try {response = request.execute();System.out.println(response.returnContent());} catch (ClientProtocolException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
3.2 增加参数
对于GET很简单,这里看看POST:
public void simpleURIPost() {URI uri = URI.create("http://www.sina.com");Request request = Request.Post(uri).bodyForm(Form.form().add("username", "zhangsan").add("pasword", "pwd").build());handleContent(request);}
3.3 对于头和整个内容的处理
对于请求头、响应头和整个响应的处理,参见下面的代码:
public void simpleHeaderPost() {Request request = Request.Post("http://www.sina.com.cn");request.addHeader("User-Agent","Ahopedog/5.0 (Linux NT 5.1; rv:5.0) Gecko/20100101 FireDog/5.0");request.setHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");handleResponse(request);handleEntity(request);}private void handleEntity(Request request) {try {HttpResponse response = request.execute().returnResponse();HttpEntity entity = response.getEntity();Header header = entity.getContentType();System.out.println(header.getName() + ": " + header.getValue());} catch (ClientProtocolException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private void handleResponse(Request request) {try {HttpResponse response = request.execute().returnResponse();Header[] headers = response.getAllHeaders();for (Header header : headers) {System.out.println("Header Name: " + header.getName()+ "; Header Value: " + header.getValue());}} catch (ClientProtocolException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
0 0
- Java开源框架类库介绍(一)--HttpComponents
- Java开源框架类库介绍(二)--FastJson
- Java开源框架类库介绍(三)--imgscalr
- Java开源框架类库介绍(四)--XStream
- Java开源框架类库介绍(五)--log4j
- Java开源框架类库介绍(六)--SLF4J
- Java:HttpComponents Overview
- HttpComponents
- Java集合框架全面介绍(一)
- Java开源缓存框架介绍
- Java开源日志框架介绍
- Flixel框架介绍一
- Maplab框架介绍(一)
- 开源框架介绍
- Java Executor并发框架(一)整体介绍
- java线程执行器框架介绍(一)--ThreadPoolExecutor
- unity开源框架ET 实战篇 之 框架demo介绍(一)
- 几个著名Java开源缓存框架介绍
- 高速缓存
- HDU 2896 病毒侵袭
- 简单的ajax登陆验证
- php中urlencode与rawurlencode的区别
- 米兰达可儿上演辣妈正传 美胸翘臀玩诱惑!
- Java开源框架类库介绍(一)--HttpComponents
- hdu 2108 Shape of HDU
- 利用nginx反向代理tomcat服务器
- Log4j具体级别及输出信息配置方法介绍
- sendRedirect和forward区别
- ACM-搜索之Red and Black——hdu1312
- 软件测试第一课
- C++编程 – Why English
- [LeetCode] Single Number II