`

HttpClient基础(一)

 
阅读更多

一、基本的使用

       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();
		}

 

  

 

 

 

 

 

 

 

 

    

分享到:
评论

相关推荐

    HttpClient请求之基础

    除了基础的GET和POST请求,HttpClient还提供了许多高级特性,如: - **重试策略**:通过`HttpRequestRetryHandler`可以定制请求失败后的重试行为。 - **连接管理**:`PoolingHttpClientConnectionManager`允许配置...

    httpclient官网教程中文版

    执行HTTP请求是使用HttpClient最基础的操作。在这个过程中,开发者只需提供一个HTTP请求对象,剩下的工作都将由HttpClient自动完成。如果请求失败,HttpClient将会抛出异常,提示开发者进行错误处理。 ##### 3.1 ...

    httpClient发送HTTP请求

    HttpClient是Apache基金会开发的一个Java库,它允许程序员方便地向HTTP服务器发送请求并接收响应。在处理HTTPS(安全超文本传输协议)请求时,HttpClient扮演着至关重要的角色,尤其是在涉及敏感数据交换或需要验证...

    Java HttpClient 全部的jar包

    Java HttpClient 是一个强大的HTTP客户端库,它允许Java开发者在应用程序中发送HTTP请求并接收响应,广泛应用于Web服务的调用、API接口测试以及自动化脚本等场景。在Java项目中,使用HttpClient可以实现与Web服务器...

    apache httpclient jar包

    - 虽然HttpClient 4.2.5主要针对HTTP/1.1,但已经开始为HTTP/2做准备,提供了一些基础支持。 10. **性能优化**: - 使用预连接(pre-emptive authentication)和连接池来减少延迟,提高响应速度。 - 使用压缩...

    httpclient

    同时,HttpClient依赖于HttpCore库,这是Apache提供的基础HTTP协议处理组件,httpcore-4.4.1.jar即为该组件的4.4.1版本,提供了HTTP连接管理、请求/响应模型等核心功能。 **一、HttpClient基本概念** 1. **...

    commons-httpclient-3.0.jar JAVA中使用HttpClient可以用到

    1. **HttpClient对象**:HttpClient是所有操作的基础,它代表一个HTTP客户端,可以配置连接管理器、请求执行器等组件。 2. **HttpMethod**:HttpClient提供了多种HttpMethod子类,如GetMethod、PostMethod等,分别...

    httpClienthttpClient

    4. **HttpResponse**:当你发送一个请求后,HttpClient会返回一个HttpResponse对象,其中包含了服务器的响应状态码、头部信息和响应实体。 5. **HttpEntity**:表示HTTP响应中的实体内容,可以是文本、二进制数据...

    HttpClient所需jar包(全) httpClient.4.13jar

    2. `httpcore-4.x.x.jar`: 这是HttpClient的基础组件,提供了网络通信的基本功能,如套接字连接和输入/输出流处理。 3. `httpmime-4.x.x.jar`: 这个库扩展了HttpClient,支持在HTTP请求中处理MIME类型的数据,比如...

    httpclient4.5.5所有包

    HttpClient 4.5.5 版本是其系列中的一个重要里程碑,它在前一版本的基础上进行了优化和完善,提供了更加稳定、高效的服务。本文将深入探讨 HttpClient 4.5.5 的核心概念、主要功能、使用方法以及实际应用。 1. **...

    httpclient4.4.1 and httpclient4.5.3.rar

    HttpClient 4.4.1是HttpClient系列的一个稳定版本,它主要关注性能优化和错误修复。以下是一些关键特性: - **连接管理**:HttpClient 4.4.1引入了更智能的连接管理和重用策略,提高了并发性能。它支持多路复用,...

    httpclient4.1.2.zip

    HttpClient 4.1.2是Apache HttpClient的一个稳定版本,它在前一版本的基础上进行了优化和增强,为开发者提供了更加高效、可靠的网络请求处理能力。 HttpClient 4.1.2的核心在于其对HTTP协议的全面支持,包括基本的...

    httpclient-4.5.jar

    2. **HttpCore**:HttpCore是HttpClient的基础模块,提供网络I/O处理和HTTP协议解析。它的主要任务是建立和维护TCP连接,以及解析HTTP消息头和体。 3. **RequestExecutor**:这是处理请求和响应的接口,HttpClient...

    httpclient所需lib

    3. **httpcore-4.2.1.jar**:这是HTTP Core库,提供了HTTP协议的基础实现,包括连接管理、请求/响应模型等,HttpClient构建在其之上。 4. **httpclient-cache-4.2.1.jar**:这是一个缓存模块,可以缓存HTTP响应,...

    commons-httpclient-3.1jar包

    3. HttpMethodBase:HttpClient 3.1中的基础请求类,可以派生出具体的HTTP方法,如GetMethod、PostMethod等。 4. Cookie管理:通过CookiePolicy和CookieSpec接口,实现对服务器返回的Cookie进行解析、存储和回发。 5...

    httpUtil httpclient 登陆携带cookie访问下一个连接

    `httpcore`提供了基本的HTTP协议处理,而`httpclient`则在此基础上添加了更高级的功能,如连接管理、重试策略等。 模拟登录的过程通常包括以下步骤: 1. **构建POST请求**:首先,你需要创建一个`HttpPost`对象,...

    httpclient4.5.zip

    它是HttpClient实现高效网络通信的基础。 3. `httpclient-cache-4.5.jar`:提供了HTTP缓存功能,使得客户端能够存储并重用之前获取的响应,提高了性能和用户体验,特别是在离线或网络不稳定的情况下。 4. `...

    httppost和httpclient一组开发包

    在Android开发中,HTTP通信是应用与服务器交互的基础,`HttpClient`和`HttpPost`就是其中常用的两个类,它们属于Apache的HTTP组件,虽然在Android API level 23之后被标记为过时,但由于其功能强大和灵活性高,仍被...

    Android HttpClient用到的jar包

    2. **创建HttpClient对象**:创建一个`HttpClient`实例,这是所有HTTP操作的基础。在较旧的Android版本中,我们可以使用`DefaultHttpClient`,但在新版本中,由于HttpClient已被弃用,建议使用其他替代方案,如...

    Httpclient所需jar包

    在Java开发中,HttpClient是一个非常重要的库,它允许开发者通过HTTP协议进行通信。这个压缩包包含的正是使用HttpClient所需的三个核心jar包:`commons-codec-1.4.jar`、`commons-httpclient-3.0.1.jar`和`commons-...

Global site tag (gtag.js) - Google Analytics