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

 

  

 

 

 

 

 

 

 

 

    

【WiFi】T830 MT7992 WMM测试修改操作说明 WiFi WMM(Wi-Fi Multimedia)是Wi-Fi联盟推出的一项技术,用于优化无线网络中的多媒体内容传输。WMM通过优先处理不同类型的数据流来改善网络性能,特别是在网络拥堵时。:WMM通过提供服务质量支持,确保语音、视频和其他多媒体应用在无线网络中获得优先处理。这有助于减少延迟和抖动,改善用户体验。:WMM将数据流分为四个优先级队列:语音、视频、最佳效果(Best Effort)和背景(Background)。语音和视频流通常被赋予更高的优先级,以确保它们在网络中得到及时传输。 阅读详情

相关推荐

SAP S4HANA F-02报错:更正统一日记账分类账的定制设置

消息号 FINS_ACDOC_CUST201 使用FINS_CUST_CONS_CHK_P去检查公司代码和分类账的设置 提示:过账期间变式为空(分类账 E1/公司代码 7500) 检查了表FINSC_LD_CMP 显示有分类账未分配过账期间变式 解决:后台配置定义分类账和货币类型的设置把过账变式维护下 路径:财务会计→财务会计全局设置→分类账→分类账→定义分类账和货币类型的设置 选中需要维护的分类账双击左侧的“分类账的公司代码设置”,找到对应的公司代码维护上即可。

qq_45068743的博客 6448

html登陆请求java_java – HTML发布请求(登录表单)

我需要登录一个网站.我尝试通过发送正确的POST请求来存档它.我可以收集所需的数据(两个安全令牌和一个cookie),这似乎没有任何问题.但最终的登录过程不起作用 – 但遗憾的是:我不知道在哪里可以找到问题,因为服务器只是将我重定向到登录页面而没有任何提示.这是我的方法的当前状态:URL url = new URL("SERVER");Map params = new LinkedHashMap&...

weixin_39856709的博客 320

PFC胶结模型实战:从线性到平行粘结的力学行为解析

本文深入解析了PFC中线性接触与平行粘结(pb模型)的核心差异与应用。平行粘结模型通过模拟胶结层的力学行为,能够有效传递拉力和抵抗弯矩,是模拟岩石、混凝土等胶结材料的关键。文章详细介绍了其变形与强度参数的设置、法向与切向行为的验证方法,并揭示了全量与增量力计算中易出现的“幽灵力”问题及其解决方案,为复杂模型的构建与调试提供了实用策略。

weixin_29230773的博客 1208

HttpClient4.5 基础教程 执行请求<三>

更多HttpClient4.5中文教程请查看:点击打开链接 ===============================================1.1.7.生产实体内容 HttpClient提供了几个类,用来通过HTTP连接高效地传输内容。这些类的实例均与内含实体请求有关,比如POST和PUT,它们能够把实体内容封装进友好的HTTP请求中。对于基本的数据容器String, byte arr

光与热的博客 1024

svn co --depth和svn up --set-depth 只check out下一层文件 只更新指定文件 只更新下一层的用法

svn的工程可能很大 有时我们只需要部分文件即可 这里介绍几个命令 1.svn co(check out) --depth --depth=empty,files,immediates,infinity 假设某svn结构如下 svn://root/PRO/A_dir/a svn://root/PRO/B_dir/b svn://root/PRO/c_file svn co --depth=emptysvn://root/PRO 此时只会在本地check out出 PRO/的空目录。 sv.

cy413026的博客 1万+

单细胞测序避坑指南:为什么你的免疫组库数据总出问题?5‘转录组7个关键细节

本文深度解析了5'端单细胞测序技术在免疫组库研究中的应用与常见问题。文章从5'端建库的分子机制入手,重点剖析了其在捕获TCR/BCR序列上的独特优势,并系统梳理了从样本处理、文库构建到数据质控全流程中7个最易出错的细节,为研究者提供了一份实用的避坑指南,旨在帮助提升免疫组库数据的质量和可靠性。

weixin_29208327的博客 482

实现HttpClient上传文件进度条

我有下面的代码为一个文件上传与Apache的HTTP的客户端端(org.apache.http.client): public static void main(String[] args) throws Exception { String fileName = "test.avi"; File file = new File(fileName); String serverResp

zacry的专栏 5432

【Matlab算法】MATLAB实现的语音信号降噪算法(附MATLAB完整代码)

语音信号降噪是语音处理领域中的一个关键问题。在实际应用中,语音信号常常被各种环境噪声污染,这不仅影响了语音的质量,还可能导致后续处理(如语音识别)的性能下降。因此,开发有效的降噪算法对于提高语音通信质量、改善语音识别系统性能等具有重要意义。 本文将介绍并实现两种经典的语音信号降噪算法:谱减法和维纳滤波。这两种方法都是基于频域处理的技术,具有实现简单、计算效率高的特点。通过MATLAB实现这些算法,我们可以直观地比较它们的性能和降噪效果。

Albert_Lsk的博客 1329

HttpClient通过InputStream形式上传文件以及通过File形式上传文件

1、准备工作 引入两个maven依赖 <!--文件上传--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.8</version> </dependency> <dependency&gt

yy的博客 4611

CloudCompare二次开发(1)——获取指定高程的所有点

使用CloudCompare插件实现获取点云数据中指定高程的所有点。

点云侠的博客 4735

华为OD新系统机试真题 - 获取大写字母瓷砖拼出独特图案数量

华为OD机试新系统真题【获取大写字母瓷砖拼出独特图案数量】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统四月二十九号机试真题【获取大写字母瓷砖拼出独特图案数量】

qq_45776114的博客 1219

HttpClient 教程 (一)

前言 超文本传输协议(HTTP)也许是当今互联网上使用的最重要的协议了。Web服务,有网络功能的设备和网络计算的发展,都持续扩展了HTTP协议的角色,超越了用户使用的Web浏览器范畴,同时,也增加了需要HTTP协议支持的应用程序的数量。 尽管java.net包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的功能。HttpClient就是寻求弥补这项空白...

weixin_34250709的博客 611

手机VPN的连接方法分享

6、返回到VPN页面,可以看到刚刚新添加的VPN,点击开启VPN后面的开关。5、在打开的添加VPN的页面中输入VPN的信息后点击右上角的“保存”按钮。7、待VPN开关开启后,可以看到添加的VPN正在连接的提示信息了。2、在打开的小米手机设置页面中点击“更多连接方式”的菜单项。3、然后在打开的更多连接方式页面中点击VPN的菜单项。4、在打开的VPN设置页面中点击“添加VPN”的按钮。1、首先在手机屏幕左右的滑动,找到手机的设置图标。

惠惠软件 3万+

HTTPClient 基础使用 一

package CJava; import java.io.IOException; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.*; /** * 本文简单介绍一些httpclient的基本内容,因为在实际开发当中使用到 * 基于http协议,现在网络上基本上是属

古影轩 1294

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java HttpClient(一:基础对象、类说明)

参考文献:http://hc.apache.org/ http://hc.apache.org/httpcomponents-client-ga/tutorial/html/ http://hc.apache.org/httpcomponents-client-ga/examples.html HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程...

随心的专栏 4871

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

httpclient异步发送请求_HttpClient系列-基础知识(一)

简述今天开始介绍下Apache HttpClient 4的全面指南,从基础到高级进阶,本文是基础知识一。状态码从Http响应中得出状态码发送Http请求后 - 我们返回一个org.apache.http.HttpResponse实例,我们可以获取到响应的状态行,并隐式地访问状态代码:response.getStatusLine().getStatusCode()使用它,我们可以验证从服务器收到的代...

weixin_39633171的博客 982

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

.net使用httpclient获取http状态码_HttpClient系列-基础知识(一)

简述今天开始介绍下Apache HttpClient 4的全面指南,从基础到高级进阶,本文是基础知识一。状态码从Http响应中得出状态码发送Http请求后 - 我们返回一个org.apache.http.HttpResponse实例,我们可以获取到响应的状态行,并隐式地访问状态代码:response.getStatusLine().getStatusCode()使用它,我们可以验证从服务器收到的代...

weixin_30351503的博客 1267

HTTPClient4.5.2学习笔记(一):基础篇

原文地址:http://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/index.html 前言: 目前HTTP(超文本传输协议)已然成为了互联网中重要的协议。在WEB服务、互联网应用和网络计算的增长继续扩大了HTTP协议的作用,超越了用户驱动的Web浏览器,同时增加了需要HTTP支持的应用程序的数量。 尽管java.ne

chenpeng19910926的专栏 7826

Apache的httpclient使用

【代码】Apache的httpclient使用。

quecongcong的博客 317

【HttpClient4.5中文教程】【第一章 :基础】1.1执行请求(一)

原文:http://blog.youkuaiyun.com/u011179993/article/details/47131773 第一章 :基础 1.1执行请求 HttpClient最基本的功能是执行HTTP方法,一个 HTTP 方法的执行包含一个或多个 HTTP 请求/HTTP 相应的交换,通常由 HttpClient的内部来处理。使用者被要求提供一个Request对象来

Ryan Z 的技术日志 671

【HttpClient】HttpClient4.5基础教程

一、前言 1、说明 HttpClient是一个目前最常用的用于模拟客户端发送http请求的工具,可用于接口自动化测试或者爬虫或者在项目中加入获取其他网站数据等; 支持目前所有的请求方式,如put,post,get,delete等; 2、maven依赖添加 maven依赖如下: &amp;amp;amp;lt;dependency&amp;amp;amp;gt; &amp;amp;amp;lt;groupId&amp;amp;amp;gt;org.apache.ht

df0128的专栏 1万+

HTTPCLIENT源码分析

HTTPCLIENT源码分析 http是应用层的协议,在传输层使用tcpip协议,可以从其源码分析,中间层就是调用socket(基于lwip协议)编程加上http协议实现,下面看源码。想看看其源码的可以从下面目录下载。 下载目录:点击这里 路径在middleware/third_party/httpclient中。 源码分析 以前已经介绍过httpclient api的使用了,此处不在赘述,本文主...

qq_38240926的博客 1119

HttpClient【一】

之前见过这东西确不知道是干嘛的,后来学习了下才发现,原来它就相当于一个游览器客户端能够发出get和post请求,然后获得返回的数据。 首先新建一个java项目,然后添加所需jar包。 然后就是代码的编写了,也比较简单。 package cn.sp.test01; import java.util.ArrayList; import java.util.List; import org

stupid_Java_learner的博客 4274

HttpClient详解(一)—简介与请求

简介 首先说说HttpClient和Http的关系:   我们知道HTTP是一个客户端和服务器端请求和应答的标准(TCP)。   我们通常发起http请求时都在客户端通过get或post的方式发起(项目中最常用的即通过Ajax实现)。   不仅如此,在服务端java.net包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的 功能。   Ht

Akk 2419

HttpClient入门学习一

1、HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。   虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 ...

HiterCoder 1088
上一篇: 关于URLConnection对象
下一篇: 如何避免BUG,这个问题头疼
liyebing
博客等级 码龄20年 32粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值