一、基本的使用
HttpClient组件(这里以HttpClient4.3为例)可以模拟浏览器Http协议的request/response请求的交互。
下面的代码是基本使用的代码示例:
String url= "http://......."; // 构建请求参数 CloseableHttpClient httpclient=HttpClients.createDefault(); HttpGet httpget=new HttpGet(url); CloseableHttpResponse response=httpclient.execute(httpget); try { HttpEntity entity=response.getEntity(); InputStream in=entity.getContent(); if(in!=null){ //...... } //........... } finally { response.close(); } }
HttpClient是线程安全的,推荐在类中相同的实例在多线程中重复使用
1、HTTP request
httpClient支持HTTP1.1协议中的GET,HEAD,POST,PUT,DELETE,TRACE以及OPTIONS。分别对应如下的类:HttpGet,HttpHead,HttpPost,HttpPut,HttpDelete,HttpTrace以及HttpOptions.
HTTP 请求的URI由protocol scheme,hostname,optional port,resource path,optional query 和其他可选的部分组成
HttpClient提供了URI的构建工具类URIBuilder.使用方法如下:
URI uri=new URIBuilder().setScheme("http") .setHost("www.google.com") .setPath("/search") .setParameter("q", "httpclient") .setParameter("aq", "f") .build(); System.out.println(uri.toString());
执行结果:http://www.google.com/search?q=httpclient&aq=f
2、HTTP Response
reponse是服务器收到并解析request之后返回给请求端的信息。
HttpResponse response=new BasicHttpResponse(HttpVersion.HTTP_1_1,HttpStatus.SC_OK,"OK"); System.out.println(response.getProtocolVersion()); System.out.println(response.getStatusLine().getStatusCode()); System.out.println(response.getStatusLine().getReasonPhrase()); System.out.println(response.getStatusLine().toString());
执行结果:
HTTP/1.1
200
OK
HTTP/1.1 200 OK
3、Http的请求头
HttpResponse response=new BasicHttpResponse(HttpVersion.HTTP_1_1,HttpStatus.SC_OK,"OK"); response.addHeader("Set-Cookie","c1=a;path=/;domain=localhost"); response.addHeader("Set-Cookie", "c2=b;path=\"/\",c3=c;domain=\"localhost\""); Header h1=response.getFirstHeader("Set-Cookie"); System.out.println(h1); Header h2=response.getLastHeader("Set-Cookie"); System.out.println(h2); Header[] hs=response.getHeaders("Set-Cookie"); System.out.println(hs.length); //最方便获取请求头属性的方式 HeaderIterator it=response.headerIterator("Set-Cookie"); while(it.hasNext()){ System.out.println(it.next()); } HeaderElementIterator it=new BasicHeaderElementIterator(response.headerIterator("Set-Cookie")); while(it.hasNext()){ HeaderElement elem=it.nextElement(); System.out.println(elem.getName()+" = " +elem.getValue()); NameValuePair[] params=elem.getParameters(); for(int i=0;i<params.length;i++){ System.out.println(" "+params[i]); } }
4、HTTP entity
主要是response返回内容的实体或者是request的时候使用post或者put方式的时候用到entity.
主要方法,HttpEntity entity=response.getEntity(); InputStream in=entity.getContent();
获取entity内容推荐的方式为HttpEntity#getContent()或者HttpEntity#writeTo(outputStream).
HttpClient也提供了工具类EntityUtils.java。但是只在信任返回来源且确切知道来源长度较小的情况下
推荐使用。
String url= "http://........"; // 构建请求参数 CloseableHttpClient httpclient=HttpClients.createDefault(); HttpGet httpget=new HttpGet(url); CloseableHttpResponse response=httpclient.execute(httpget); try { HttpEntity entity=response.getEntity(); if(entity!=null){ long len=entity.getContentLength(); //当返回值长度较小的时候,使用工具类 if(len!=-1&&len<2048){ System.out.println(EntityUtils.toString(entity)); }else{ //否则使用IO流来读取 } } } finally { response.close(); }
有时候需要重复多次获取entity,则需要用到包装类BufferedHttpEntity.java.代码示例如下:
HttpEntity entity=response.getEntity(); if(entity!=null){ entity=new BufferedHttpEntity(entity); }
构建Entity的方式有多种数据形式,比如,string,byte array,input stream,file等。分别对应如下类,StringEntity,ByteArrayEntity,InputStreamEntity,FileEntity.代码示例如下:
File file=new File("somefile.txt"); FileEntity entity=new FileEntity(file); HttpPost httppost=new HttpPost("http://localhost/.../action.do"); httppost.setEntity(entity);
5、模拟HTML forms提交
List<NameValuePair> formparams=new ArrayList<NameValuePair>(); formparams.add(new BasicNameValuePair("param1", "value1")); formparams.add(new BasicNameValuePair("param2", "value2")); formparams.add(new BasicNameValuePair("param3", "value3")); UrlEncodedFormEntity entity=new UrlEncodedFormEntity(formparams,Consts.UTF_8); HttpPost httppost=new HttpPost("http://localhost/handler.do"); httppost.setEntity(entity);
6、Response Handlers
ResponseHandler,.....
7、针对幂等的请求,自定义重试机制的handler
//自定义重试机制 HttpRequestRetryHandler myRetryHandler=new HttpRequestRetryHandler(){ public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { if (executionCount >= 5) { // Do not retry if over max retry count return false; } if (exception instanceof InterruptedIOException) { // Timeout return false; } if (exception instanceof UnknownHostException) { // Unknown host return false; } if (exception instanceof ConnectTimeoutException) { // Connection refused return false; } if (exception instanceof SSLException) { // SSL handshake exception return false; } HttpClientContext clientContext = HttpClientContext.adapt(context); HttpRequest request = clientContext.getRequest(); boolean idempotent = !(request instanceof HttpEntityEnclosingRequest); if (idempotent) { // Retry if the request is considered idempotent return true; } return false; } }; CloseableHttpClient httpclient = HttpClients.custom() .setRetryHandler(myRetryHandler) .build(); }
8、HttpClient的拦截器(interceptor)
类似于servlet,需要自己保证线程安全。
代码示例:
//http拦截器 CloseableHttpClient httpclient = HttpClients.custom() .addInterceptorLast(new HttpRequestInterceptor() { public void process( final HttpRequest request, final HttpContext context) throws HttpException, IOException { AtomicInteger count = (AtomicInteger) context.getAttribute("count1"); request.addHeader("count1", Integer.toString(count.getAndIncrement())); } }).build(); AtomicInteger count = new AtomicInteger(1); HttpClientContext localContext = HttpClientContext.create(); localContext.setAttribute("count1", count); localContext.setAttribute("count2", count); HttpGet httpget = new HttpGet(url); for (int i = 0; i < 10; i++) { CloseableHttpResponse response = httpclient.execute(httpget, localContext); try { HttpEntity entity = response.getEntity(); //..... } finally { response.close(); } } }
9、重定向的Handler
httpcomponents 在处理重定向问题时,默认的情况下是有限制的:
对于 HEAD 和 GET 方法, HttpComponents 会自动做重定向处理;
对于 POST 和 PUT 方法, HttpComponents 不会进行自动重定向处理,这需要用户自己设定才行。
DefaultHttpClient client = new DefaultHttpClient(); LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy(); // 设定自己需要的重定向策略 client.setRedirectStrategy(redirectStrategy); // 创建登陆form List<NameValuePair> formparams = new ArrayList<NameValuePair>(); formparams.add(new BasicNameValuePair("username", USERNAME)); formparams.add(new BasicNameValuePair("password", PASSWORD)); UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); // 创建登陆请求 HttpPost loginPost = new HttpPost(URL_LOGIN); loginPost.setEntity(formEntity); // 执行请求, // 在使用默认的重定向策略是,状态代码返回的是 302 // 使用了重定向策略后, 状态代码返回的是 200 HttpResponse loginResponse = client.execute(loginPost); System.out.println("登录请求放回状态代码: " + loginResponse.getStatusLine().getStatusCode());
获取重定向的URI以及还原之后的URL:
CloseableHttpClient httpclient = HttpClients.createDefault(); HttpClientContext context = HttpClientContext.create(); HttpGet httpget = new HttpGet(url); CloseableHttpResponse response = httpclient.execute(httpget, context); try { HttpHost target = context.getTargetHost(); List<URI> redirectLocations = context.getRedirectLocations(); URI location = URIUtils.resolve(httpget.getURI(), target, redirectLocations); System.out.println("Final HTTP location: " + location.toASCIIString()); // Expected to be an absolute URI } finally { response.close(); }
相关推荐
除了基础的GET和POST请求,HttpClient还提供了许多高级特性,如: - **重试策略**:通过`HttpRequestRetryHandler`可以定制请求失败后的重试行为。 - **连接管理**:`PoolingHttpClientConnectionManager`允许配置...
HttpClient是Apache基金会开发的一个Java库,它允许程序员方便地向HTTP服务器发送请求并接收响应。在处理HTTPS(安全超文本传输协议)请求时,HttpClient扮演着至关重要的角色,尤其是在涉及敏感数据交换或需要验证...
Java HttpClient 是一个强大的HTTP客户端库,它允许Java开发者在应用程序中发送HTTP请求并接收响应,广泛应用于Web服务的调用、API接口测试以及自动化脚本等场景。在Java项目中,使用HttpClient可以实现与Web服务器...
同时,HttpClient依赖于HttpCore库,这是Apache提供的基础HTTP协议处理组件,httpcore-4.4.1.jar即为该组件的4.4.1版本,提供了HTTP连接管理、请求/响应模型等核心功能。 **一、HttpClient基本概念** 1. **...
- 虽然HttpClient 4.2.5主要针对HTTP/1.1,但已经开始为HTTP/2做准备,提供了一些基础支持。 10. **性能优化**: - 使用预连接(pre-emptive authentication)和连接池来减少延迟,提高响应速度。 - 使用压缩...
1. **HttpClient对象**:HttpClient是所有操作的基础,它代表一个HTTP客户端,可以配置连接管理器、请求执行器等组件。 2. **HttpMethod**:HttpClient提供了多种HttpMethod子类,如GetMethod、PostMethod等,分别...
4. **HttpResponse**:当你发送一个请求后,HttpClient会返回一个HttpResponse对象,其中包含了服务器的响应状态码、头部信息和响应实体。 5. **HttpEntity**:表示HTTP响应中的实体内容,可以是文本、二进制数据...
2. `httpcore-4.x.x.jar`: 这是HttpClient的基础组件,提供了网络通信的基本功能,如套接字连接和输入/输出流处理。 3. `httpmime-4.x.x.jar`: 这个库扩展了HttpClient,支持在HTTP请求中处理MIME类型的数据,比如...
HttpClient 4.5.5 版本是其系列中的一个重要里程碑,它在前一版本的基础上进行了优化和完善,提供了更加稳定、高效的服务。本文将深入探讨 HttpClient 4.5.5 的核心概念、主要功能、使用方法以及实际应用。 1. **...
HttpClient 4.4.1是HttpClient系列的一个稳定版本,它主要关注性能优化和错误修复。以下是一些关键特性: - **连接管理**:HttpClient 4.4.1引入了更智能的连接管理和重用策略,提高了并发性能。它支持多路复用,...
HttpClient 4.1.2是Apache HttpClient的一个稳定版本,它在前一版本的基础上进行了优化和增强,为开发者提供了更加高效、可靠的网络请求处理能力。 HttpClient 4.1.2的核心在于其对HTTP协议的全面支持,包括基本的...
3. **httpcore-4.2.1.jar**:这是HTTP Core库,提供了HTTP协议的基础实现,包括连接管理、请求/响应模型等,HttpClient构建在其之上。 4. **httpclient-cache-4.2.1.jar**:这是一个缓存模块,可以缓存HTTP响应,...
3. HttpMethodBase:HttpClient 3.1中的基础请求类,可以派生出具体的HTTP方法,如GetMethod、PostMethod等。 4. Cookie管理:通过CookiePolicy和CookieSpec接口,实现对服务器返回的Cookie进行解析、存储和回发。 5...
`httpcore`提供了基本的HTTP协议处理,而`httpclient`则在此基础上添加了更高级的功能,如连接管理、重试策略等。 模拟登录的过程通常包括以下步骤: 1. **构建POST请求**:首先,你需要创建一个`HttpPost`对象,...
执行HTTP请求是使用HttpClient最基础的操作。在这个过程中,开发者只需提供一个HTTP请求对象,剩下的工作都将由HttpClient自动完成。如果请求失败,HttpClient将会抛出异常,提示开发者进行错误处理。 ##### 3.1 ...
它是HttpClient实现高效网络通信的基础。 3. `httpclient-cache-4.5.jar`:提供了HTTP缓存功能,使得客户端能够存储并重用之前获取的响应,提高了性能和用户体验,特别是在离线或网络不稳定的情况下。 4. `...
在Android开发中,HTTP通信是应用与服务器交互的基础,`HttpClient`和`HttpPost`就是其中常用的两个类,它们属于Apache的HTTP组件,虽然在Android API level 23之后被标记为过时,但由于其功能强大和灵活性高,仍被...
2. **创建HttpClient对象**:创建一个`HttpClient`实例,这是所有HTTP操作的基础。在较旧的Android版本中,我们可以使用`DefaultHttpClient`,但在新版本中,由于HttpClient已被弃用,建议使用其他替代方案,如...
在Java开发中,HttpClient是一个非常重要的库,它允许开发者通过HTTP协议进行通信。这个压缩包包含的正是使用HttpClient所需的三个核心jar包:`commons-codec-1.4.jar`、`commons-httpclient-3.0.1.jar`和`commons-...
5. **HTTP/2 支持**:虽然不是 HttpClient 4.5 的主要目标,但为后续版本的 HTTP/2 支持奠定了基础。 三、HttpClient 4.5 源码解析 1. **执行流程**:从 `HttpClient.execute()` 方法开始,通过 `...