HTTPClient用法
httpClient4.5closeableHttpClient用法
httpClient4.5closeableHttpClient⽤法HttpClient⼀简介1.尽管包提供了基本通过HTTP访问资源的功能,但它没有提供全⾯的灵活性和其它很多应⽤程序需要的功能。
HttpClient就是寻求弥补这项空⽩的组件,通过提供⼀个有效的,保持更新的,功能丰富的软件包来实现客户端最新的HTTP标准和建议。
为扩展⽽设计,同时为基本的HTTP协议提供强⼤的⽀持,HttpClient组件也许就是构建HTTP客户端应⽤程序,⽐如web浏览器,web服务端,利⽤或扩展HTTP协议进⾏分布式通信的系统的开发⼈员的关注点。
2.HttpClient不是⼀个浏览器。
它是⼀个客户端的HTTP通信实现库。
HttpClient的⽬标是发送和接收HTTP报⽂。
HttpClient不会去缓存内容,执⾏嵌⼊在HTML页⾯中的javascript代码,猜测内容类型,重新格式化请求/重定向URI,或者其它和HTTP运输⽆关的功能。
⼆使⽤1.执⾏请求(1)HttpClient最重要的功能是执⾏HTTP⽅法。
⼀个HTTP⽅法的执⾏包含⼀个或多个HTTP请求/HTTP响应交换,通常由HttpClient的内部来处理。
⽽期望⽤户提供⼀个要执⾏的请求对象,⽽HttpClient期望传输请求到⽬标服务器并返回对应的响应对象,或者当执⾏不成功时抛出异常。
⼀个很简单的请求执⾏过程的⽰例:HttpClient httpclient = new DefaultHttpClient();HttpGet httpget = new HttpGet("http://localhost/");HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();if (entity != null) {InputStream instream = entity.getContent();int l;byte[] tmp = new byte[2048];while ((l = instream.read(tmp)) != -1) {}}(2)HTTP请求所有HTTP请求有⼀个组合了⽅法名,请求URI和HTTP协议版本的请求⾏。
HttpClient的基本使用
HttpClient的基本使用HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP 协议最新的版本和建议。
HttpClient简介HTTP 协议可能是现在Internet 上使用得最多、最重要的协议了,越来越多的Java 应用程序需要直接通过HTTP 协议来访问网络资源。
虽然在JDK 的 包中已经提供了访问HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
所以HttpClient 很好的弥补了JDK 在这一个方面的缺憾。
需要jar包的地址:commons-httpclient-3.1-rc1.jar:/commons/httpclient/downloads.htmlcommons-logging-1.1.jar:/site/downloads/downloads_commons-logging.cgicommons-codec-1.3.jar:/site/downloads/downloads_commons-codec既然是访问服务器,其实主要就是get与post的过程。
在访问网页的时候我们知道,一般的访问就是直接地点击链接得到网页或是通过提交一些数据才能访问到所需的网页。
简单的说,那么前者就是一个get的过程,后者就是post的过程。
一般一个get的过程需要以下几步:1. 创建HttpClient 的实例2. 创建某种连接方法的实例,在这里是GetMethod。
在GetMethod 的构造函数中传入待连接的地址3. 调用第一步中创建好的实例的execute 方法来执行第二步中创建好的GetMethod 实例4. 释放连接。
无论执行方法是否成功,都必须释放连接5. 对得到后的内容进行处理注意在第五步的时候存在着三种取得目标内容的方法:1. getResponseBody,该方法返回的是目标的二进制的byte流;2. getResponseBodyAsString,这个方法返回的是String类型;3. getResponseBodyAsStream,这个方法对于目标地址中有大量数据需要传输;具体情况根据实际情况而定.附上访问网易首页的的代码:import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import mons.httpclient.DefaultHttpMethodRetryHandler;import mons.httpclient.HttpClient;import mons.httpclient.HttpException;import mons.httpclient.HttpStatus;import mons.httpclient.methods.GetMethod;import mons.httpclient.params.HttpMethodParams;public class GetSample {/**采用数据流的方式读取页面数据,最后以字符串的形式呈现。
异步httpclient(httpasyncclient)的使用与总结
异步httpclient(httpasyncclient)的使⽤与总结参考:1. 前⾔应⽤层的⽹络模型有同步与异步。
同步意味当前线程是阻塞的,只有本次请求完成后才能进⾏下⼀次请求;异步意味着所有的请求可以同时塞⼊缓冲区,不阻塞当前的线程;httpclient在4.x之后开始提供基于nio的异步版本httpasyncclient,httpasyncclient借助了Java并发库和nio进⾏封装(虽说NIO是同步⾮阻塞IO,但是HttpAsyncClient提供了回调的机制,与netty类似,所以可以模拟类似于AIO的效果),其调⽤⽅式⾮常便捷,但是其中也有许多需要注意的地⽅。
2. pom⽂件本⽂依赖4.1.2,当前最新的客户端版本是4.1.3maven repository 地址<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.5</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore-nio</artifactId><version>4.4.5</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpasyncclient</artifactId><version>4.1.2</version></dependency>12345678910111213141516171819202122233. 简单的实例public class TestHttpClient {public static void main(String[] args){RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(50000).setSocketTimeout(50000).setConnectionRequestTimeout(1000).build();//配置io线程IOReactorConfig ioReactorConfig = IOReactorConfig.custom().setIoThreadCount(Runtime.getRuntime().availableProcessors()).setSoKeepAlive(true).build();//设置连接池⼤⼩ConnectingIOReactor ioReactor=null;try {ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);} catch (IOReactorException e) {e.printStackTrace();}PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(ioReactor); connManager.setMaxTotal(100);connManager.setDefaultMaxPerRoute(100);final CloseableHttpAsyncClient client = HttpAsyncClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(requestConfig).build();//构造请求String url = "http://127.0.0.1:9200/_bulk";HttpPost httpPost = new HttpPost(url);StringEntity entity = null;try {String a = "{ \"index\": { \"_index\": \"test\", \"_type\": \"test\"} }\n" +"{\"name\": \"上海\",\"age\":33}\n";entity = new StringEntity(a);} catch (UnsupportedEncodingException e) {e.printStackTrace();}httpPost.setEntity(entity);//startclient.start();//异步请求client.execute(httpPost, new Back());while(true){try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}static class Back implements FutureCallback<HttpResponse>{private long start = System.currentTimeMillis();Back(){}public void completed(HttpResponse httpResponse) {try {System.out.println("cost is:"+(System.currentTimeMillis()-start)+":"+EntityUtils.toString(httpResponse.getEntity())); } catch (IOException e) {e.printStackTrace();}}public void failed(Exception e) {System.err.println(" cost is:"+(System.currentTimeMillis()-start)+":"+e);}public void cancelled() {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66717273747576777879808182834. ⼏个重要的参数4.1 TimeOut(3个)的设置ConnectTimeout : 连接超时,连接建⽴时间,三次握⼿完成时间。
C#中HttpClient的简单使用
C#中HttpClient的简单使⽤介绍当我们在开发客户端还有少部分服务端程序时,数据需要从 Webapi 服务器取得。
在以前我使⽤的⽐较多的时和,在新的 .Net 版本中,团队为其带来了更多的可选择性——新的。
它有着更加灵活的 API。
发送请求和接收响应主要是通过 HttpRequestMessage 和HttpResponseMessage 这来给你个类,通过属性 Content 获取 http 响应内容。
区别HttpClient 与 WebClient 和 HttpWebRequest 相⽐,有以下⼏个主义的1. HttpClient 实例初始化时不与服务器域名或者主机地址绑定,也就是說可以通过⼀个 HttpClient 实例发送多个不同的请求(⽐如同⼀个HttpClient 请求和两个服务器数据)2. HttpClient 通过设置 DefaultHeaders 设置 HttpHeader 并且应⽤于该实例的所有请求3. HttpClient 使⽤可以很容易的处理异步请求(Async / Await)使⽤⽅法HttpClient 提供有与 Http Method 匹配的⽅法,⽐如 GET / POST / PUT ...等。
先实现模拟⼀个 GET 请求,代码如下// 传⼊参数 url 为请求地址async Task Get(string uri = "/search";){// 使⽤ using 语法建⽴⼀个明确周期的 HttpClient 实例using (HttpClient client = new HttpClient()){try{// 设置超时限制,有效防⽌浪费资源client.Timeout = TimeSpan.FromSeconds(30);//使⽤ GetAsync 进⾏异步 HTTPGET 请求HttpResponseMessage response = await client.GetAsync(uri);// 判断服务器响应代码是否为 2XXresponse.EnsureSuccessStatusCode();//使⽤ await 语法读取响应内容string responseBody = await response.Content.ReadAsStringAsync();Console.WriteLine(responseBody);}catch (HttpRequestException e){Console.WriteLine("Error Message :{0} ", e.Message);}}}除了直接使⽤与 Http Method 对应的⽅法外,还可以单独构建 HttpRequestMessage 实例进⾏请求async Task Get(string uri = "/search";){using (HttpClient client = new HttpClient()){HttpRequestMessage httpRequest = new HttpRequestMessage(HttpMethod.Get, uri);await client.SendAsync(httpRequest).ContinueWith(responseTask =>{Console.WriteLine("Response: {0}", responseTask.Result);});}}⾄于 Post 请求,对于初次接触 HttpClient 的⼈可能显得有些复杂,⽐较折腾,另⼀篇⽂章再讲解。
黑马程序员安卓教程:使用 HttpClient 提交数据(一)
使用HttpClient提交数据(一)HttpClient 是Apache Jakarta Common 下的子项目,提供了高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP协议最新的版本。
HttpClient 被内置到Android SDK 中,因此可以在不添加任何额外jar 包情况下,直接使用。
1.3.1get 方式提交在1.2 节工程的基础上,只需要修改部分代码即可。
因此这里只给出核心代码。
【文件1-5】get方式提交数据代码片段1./**2.* HttpCLient使用get方式完成用户的登录3.*4.* @param view5.*/6.public void login3(View view){7.// 获取用户数据8.final String username= et_username.getText().toString().trim();119.final String password= et_password.getText().toString().trim();10.// 校验数据11.if (TextUtils.isEmpty(password) ||TextUtils.isEmpty(username)){12.Toast.makeText(this, "用户名或密码不能为空!",Toast.LENGTH_SHORT).show();13.return;14.}15.// 开启子线程16.new Thread(new Runnable(){17.18.@Override19.public void run() {20.String path=21."http://10.0.2.2:8080/userlogin/servlet/LoginServlet?username="22.+ URLEncoder.encode(username) +"&password=" +password;23.try{24. // 创建一个httpClient 对象25. HttpClient client = new DefaultHttpClient();26. // 创建一个请求方式27. HttpGet request = new HttpGet(path);28. // 执行操作29. HttpResponse response = client.execute(request);30. // 获取放回状态对象31. StatusLine statusLine = response.getStatusLine();32. // 获取状态码33. int statusCode =statusLine.getStatusCode();34. if (200 == statusCode) {35. // 获取服务器返回的对象36. HttpEntity entity = response.getEntity();37. // 获取输入流38. InputStream inputStream = entity.getContent();39. // 将输入流转化为字符串40. String data = StreamUtils.inputStream2String(inputStream);41. handler.obtainMessage(RESULT_OK, data).sendToTarget();42. } else {43. handler.obtainMessage(RESULT_CANCELED, statusCode).sendToTarget();44. }45.46.}catch (Exception e) {47. e.printStackTrace();48. handler.obtainMessage(RESULT_CANCELED, e).sendToTarget();50.}51.}).start();52.}。
HttpClient及有关jar包详解
HttpClient及有关jar包详解以下列出的是HttpClient 提供的主要的功能,要知道更多详细的功能可以参见HttpClient 的主页。
(1)实现了所有HTTP 的方法(GET,POST,PUT,HEAD 等)(2)支持自动转向(3)支持HTTPS 协议(4)支持代理服务器等(1) GET方法使用HttpClient 需要以下6 个步骤:1. 创建HttpClient 的实例2. 创建某种连接方法的实例,在这里是GetMethod。
在GetMethod 的构造函数中传入待连接的地址3. 调用第一步中创建好的实例的execute 方法来执行第二步中创建好的method 实例4. 读response5. 释放连接。
无论执行方法是否成功,都必须释放连接6. 对得到后的内容进行处理根据以上步骤,我们来编写用GET方法来取得某网页内容的代码。
大部分情况下HttpClient 默认的构造函数已经足够使用。
HttpClient httpClient = new HttpClient();创建GET方法的实例。
在GET方法的构造函数中传入待连接的地址即可。
用GetMethod 将会自动处理转发过程,如果想要把自动处理转发过程去掉的话,可以调用方法setFollowRedirects(false)。
GetMethod getMethod = new GetMethod(".....");调用实例httpClient的executeMethod方法来执行getMethod。
由于是执行在网络上的程序,在运行executeMethod方法的时候,需要处理两个异常,分别是HttpException和IOException。
引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,并且该异常发生是不可恢复的;第二种异常一般是由于网络原因引起的异常,对于这种异常(IOException),HttpClient 会根据你指定的恢复策略自动试着重新执行executeMethod方法。
C#中HttpClient使用注意(预热与长连接)
C#中HttpClient使⽤注意(预热与长连接)最近在测试⼀个第三⽅API,准备集成在我们的⽹站应⽤中。
API的调⽤使⽤的是.NET中的HttpClient,由于这个API会在关键业务中⽤到,对调⽤API的整体响应速度有严格要求,所以对HttpClient有了格外的关注。
开始测试的时候,只在客户端通过HttpClient⽤PostAsync发了⼀个http post请求。
测试时发现,从创建HttpClient实例,到发出请求,到读取到服务器的响应数据总耗时在2s左右,⽽且多次测试都是这样。
2s的响应速度当然是⽆法让⼈接受的,我们希望⾄少控制在100ms以内。
于是开始追查这个问题的原因。
在API的返回数据中包含了该请求在服务端执⾏的耗时,这个耗时都在20ms以内,问题与服务端API⽆关。
于是把怀疑点放到了⽹络延迟上,但ping服务器的响应时间都在10ms左右,⽹络延迟的可能性也不⼤。
当我们正准备换⼀个⽹络环境进⾏测试时,突然想到,我们的测试⽅式有些问题。
我们只通过HttpClient发了⼀个PostAsync 请求,假如HttpClient在第⼀次调⽤时存在某种预热机制(⽐如在EF中就有这样的机制),现在2s的总耗时可能⼤多消耗在HttpClient的预热上。
于是修改测试代码,将调⽤由1次改为100次,然后恍然⼤悟地发现——只有第1次是2s,接下来的99次都在100ms以内。
果然是HttpClient的某种预热机制在搞⿁!既然知道了是HttpClient预热机制的原因,那我们可以帮HttpClient进⾏热⾝,减少第⼀次请求的耗时。
我们尝试了⼀种预热⽅式,在正式发http post请求之前,先发⼀个http head请求,代码如下:_httpClient.SendAsync(new HttpRequestMessage {Method = new HttpMethod("HEAD"),RequestUri = new Uri(BASE_ADDRESS + "/") }).Result.EnsureSuccessStatusCode();经测试,通过这种热⾝⽅法,可以将第⼀次请求的耗时由2s左右降到1s以内(测试结果是700多ms)。
HttpClient的基本使用
HttpClient的基本使用1. 引入HttpClient库:首先,需要将HttpClient库添加到项目的依赖中。
可以通过Maven或Gradle来添加依赖。
2. 创建HttpClient实例:接下来,需要创建一个HttpClient实例。
可以使用HttpClientBuilder类来构建实例。
````java```3. 创建Http请求:使用HttpGet、HttpPost等类来创建具体的Http请求对象。
可以设置请求的URL、请求头、请求体等信息。
````java```4. 执行Http请求:使用HttpClient实例来执行Http请求。
可以调用execute方法来发送请求,并获取响应对象。
````java```5. 处理Http响应:通过HttpResponse对象可以获取响应的状态码、响应头、响应体等信息。
````java```6. 释放资源:在完成所有的Http请求和响应处理后,需要释放相关的资源,如关闭HttpClient实例。
````java```除了基本的使用方法,HttpClient还提供了一些高级功能,例如:-设置请求超时时间:可以通过设置连接超时时间和读取超时时间来控制请求的超时行为。
````javaRequestConfig requestConfig = RequestConfig.custom.setConnectTimeout(5000) // 设置连接超时时间为5秒.setSocketTimeout(5000) // 设置读取超时时间为5秒.build(;```-设置请求头:可以通过设置请求头来发送特定的HTTP头部信息。
````java```- 发送POST请求:可以使用HttpPost类来发送POST请求,并设置请求体的内容。
````javaStringEntity requestEntity = new StringEntity("request body");```- Cookie管理:HttpClient可以自动处理和管理Cookie,可以通过CookieStore接口来获取和设置Cookie。
HttpClient配置及运用(一)
HttpClient配置及运⽤(⼀) HttpComponents是Apache 旗下的项⽬。
其中有⼀个HttpClient,即HTTP客户端。
之后我们建⽴项⽬,导⼊jar包,开始开发 ⼀、获取⽹页内容:package com.zhi.httpClient;import java.io.IOException;import org.apache.http.HttpEntity;import org.apache.http.ParseException;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;public class Demo {public static void main(String[] args) {CloseableHttpClient closeableHttpClient=HttpClients.createDefault(); //1、创建实例//CloseableHttpClient意思是:可关闭的HttpGet httpGet=new HttpGet(""); //2、创建实例//限制类型/CloseableHttpResponse closeableHttpResponse=null;try {closeableHttpResponse=closeableHttpClient.execute(httpGet); //3、执⾏} catch (ClientProtocolException e) { //客户端协议异常// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) { //IO异常// TODO Auto-generated catch blocke.printStackTrace();}HttpEntity httpEntity=closeableHttpResponse.getEntity(); //4、获取实体String str="";try {str=EntityUtils.toString(httpEntity, "utf-8"); //获取⽹页内容,并且指定编码} catch (ParseException e) { //解析异常// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(str);//关闭closeableHttpResponsetry {closeableHttpResponse.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//关闭closeableHttpClienttry {closeableHttpClient.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} 代码有很多,但是很多是在处理异常,所以我们也可以使⽤throws在⽅法上抛出,以简化代码格式,让其更好看。
经典教程httpClient4
目录HttpClient简介 (4)1)百科名片: (4)2)HttpClient 的范围 (4)3)httpClient 特性 (4)HttpClient基本功能的使用 (6)a)环境准备 (6)b)几个主要类解释 (6)c)第一个程序 (6)d)如何传递参数 (8)e)模拟表单登录 (10)f)HttpClient连接SSL (12)1)生成KeyStore (12)2)配置tomcat服务器支持SSL (13)3)用浏览器访问你的应用 (15)4)用httpClient访问https (15)HttpClient简介1)百科名片:HTTP 协议可能是现在Internet 上使用得最多、最重要的协议了,越来越多的Java 应用程序需要直接通过HTTP 协议来访问网络资源。
虽然在JDK 的java net包中已经提供了访问HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
HttpClient 是Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP 协议的客户端编程工具包,并且它支持HTTP 协议最新的版本和建议。
HttpClient 已经应用在很多的项目中,比如Apache Jakarta 上很著名的另外两个开源项目Cactus 和HTMLUnit 都使用了HttpClient。
现在HttpClient最新版本为HttpClient 4.1.2)HttpClient 的范围•基于HttpCore的客户端HTTP运输实现库•基于经典(阻塞)I/O•内容无关3)httpClient 特性•基于标准,纯净的java语言.实现了Http1.0和Http1.1•以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE).•支持HTTPS协议.•通过Http代理建立透明的连接.•利用CONNECT 方法通过Http代理建立隧道的https连接.•Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos 认证方案.•插件式的自定义认证方案.•便携可靠的套接字工厂使它更容易的使用第三方解决方案.•连接管理器支持多线程应用.支持设置最大连接数,同时支持设置每个主机的最大连接数.发现并关闭过期的连接.•Automatic Cookie handling for reading Set-Cookie: headers from the server and sending them back out in a Cookie: header when appropriate.•插件式的自定义Cookie策略.•Request output streams to avoid buffering any content body by streaming directly to the socket to the server.•Response input streams to efficiently read the response body by streaming directly from the socket to the server.•在http1.0和http1.1中利用KeepAlive保持持久连接.•直接获取服务器发送的response code和headers.•设置连接超时的能力.•实验性的支持http1.1 response caching.•源代码基于Apache License 可免费获取.HttpClient基本功能的使用a)环境准备•从apache下载httpClient;•下载地址: /downloads.cgi;•解压、将lib下的jar导入工程;b)几个主要类解释c)第一个程序d)如何传递参数e)模拟表单登录f)HttpClient连接SSL1)生成KeyStore打开cmd,输入(jdk环境变量当然是配置好的):keytool -genkey -alias tomcat -keyalg RSA –validity 60 -keystore D:\tomcat.keystorecmd输出:输入keystore密码:******您的名字与姓氏是什么?[Unknown]:localhost您的组织单位名称是什么?[Unknown]:it您的组织名称是什么?[Unknown]:dev您所在的城市或区域名称是什么?[Unknown]:bj您所在的州或省份名称是什么?[Unknown]:bj该单位的两字母国家代码是什么[Unknown]:CNCN=localhost, OU= it, O= dev, L=bj, ST=bj, C=CN 正确吗?[否]:Y输入的主密码(如果和keystore 密码相同,按回车):*******参数说明:-genkey表示生成密钥-validity指定证书有效期,这里是60天-alias指定别名,这里是tomcat-keyalg指定算法,这里是RSA-keystore指定存储位置,这里是D:\ tomcat.keystore使用的自定义密码为123456Keytool 详细命令说明请参考百度百科;*其中您的名字与姓氏是什么?localhost是网站的域名或者ip,根据实际情况填写。
HttpClient详细使用示例详解
HttpClient详细使⽤⽰例详解⽬录进⼊正题详细使⽤⽰例HttpClient 是Apache Jakarta Common 下的⼦项⽬,可以⽤来提供⾼效的、最新的、功能丰富的⽀持 HTTP 协议的客户端编程⼯具包,并且它⽀持 HTTP 协议最新的版本和建议。
HTTP 协议可能是现在 Internet 上使⽤得最多、最重要的协议了,越来越多的 Java 应⽤程序需要直接通过 HTTP 协议来访问⽹络资源。
虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于⼤部分应⽤程序来说,JDK 库本⾝提供的功能还不够丰富和灵活。
HttpClient 是 Apache Jakarta Common 下的⼦项⽬,⽤来提供⾼效的、最新的、功能丰富的⽀持 HTTP 协议的客户端编程⼯具包,并且它⽀持 HTTP 协议最新的版本和建议。
HTTP和浏览器有点像,但却不是浏览器。
很多⼈觉得既然HttpClient是⼀个HTTP客户端编程⼯具,很多⼈把他当做浏览器来理解,但是其实HttpClient不是浏览器,它是⼀个HTTP通信库,因此它只提供⼀个通⽤浏览器应⽤程序所期望的功能⼦集,最根本的区别是HttpClient中没有⽤户界⾯,浏览器需要⼀个渲染引擎来显⽰页⾯,并解释⽤户输⼊,例如⿏标点击显⽰页⾯上的某处,有⼀个布局引擎,计算如何显⽰HTML页⾯,包括级联样式表和图像。
javascript解释器运⾏嵌⼊HTML页⾯或从HTML页⾯引⽤的javascript代码。
来⾃⽤户界⾯的事件被传递到javascript解释器进⾏处理。
除此之外,还有⽤于插件的接⼝,可以处理Applet,嵌⼊式媒体对象(如pdf⽂件,Quicktime电影和Flash动画)或ActiveX控件(可以执⾏任何操作)。
HttpClient只能以编程的⽅式通过其API⽤于传输和接受HTTP消息。
HttpClient的主要功能:实现了所有 HTTP 的⽅法(GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等)⽀持 HTTPS 协议⽀持代理服务器(Nginx等)等⽀持⾃动(跳转)转向……进⼊正题环境说明:JDK1.8、SpringBoot准备环节第⼀步:在pom.xml中引⼊HttpClient的依赖第⼆步:引⼊fastjson依赖注:本⼈引⼊此依赖的⽬的是,在后续⽰例中,会⽤到“将对象转化为json字符串的功能”,也可以引其他有此功能的依赖。
关于httpclient的总结
3..setCredentials(newAuthScope("localhost",443),
4.newUsernamePasswordCredentials("username","password"));
Java代码
1.(3)如果不想获取HTTPClient返回的信息
21.for(inti =0; i < cookies.size(); i++) {
22.System.out.println("Local cookie: "+ cookies.get(i));
23.}
24.//获取消息头的信息
25.Header[] headers = response.getAllHeaders();
5.File file =newFile(args[0]);
6.InputStreamEntity reqEntity =newInputStreamEntity(
7.newFileInputStream(file), -1);
8.reqEntity.setContentType("binary/octet-stream");
12.HttpResponse response = httpclient.execute(httpget, localContext);
13.//获取本地信息
14.HttpEntity entity = response.getEntity();
15.System.out.println(response.getStatusLine());
C#客户端HttpClient请求认证及数据传输
C#客户端HttpClient请求认证及数据传输⽬录⼀,授权认证1. 基础认证⽰例2. JWT 认证⽰例3. Cookie ⽰例⼆,请求类型三,数据传输1. Query2. Header3. 表单4. JSON5. 上传⽂件⼀,授权认证客户端请求服务器时,需要通过授权认证许可,⽅能获取服务器资源,⽬前⽐较常见的认证⽅式有 Basic 、JWT、Cookie。
HttpClient 是 C# 中的 HTTP/HTTPS 客户端,⽤于发送 HTTP 请求和接收来⾃通过 URI 确认的资源的 HTTP 响应。
下⾯以具体代码做⽰范。
1. 基础认证⽰例// Basic基础认证public async Task Basic(string user, string password, string url){// 如果认证页⾯是 https 的,请参考⼀下 jwt 认证的 HttpClientHandler// 创建 clientHttpClient client = new HttpClient();// 创建⾝份认证// using .Http.Headers;AuthenticationHeaderValue authentication = new AuthenticationHeaderValue("Basic",Convert.ToBase64String(Encoding.UTF8.GetBytes($"{user}:{password}")));client.DefaultRequestHeaders.Authorization = authentication;byte[] response = await client.GetByteArrayAsync(url);client.Dispose();}可以看到 Basic 认证的安全程度⾮常低,多⽤于路由器和嵌⼊式设备,⽽且往往不会使⽤ HTTPS。
HttpClient介绍和简单使用流程
HttpClient介绍和简单使⽤流程HttpClientSpringCloud中服务和服务之间的调⽤全部是使⽤HttpClient,还有前⾯使⽤SolrJ中就封装了HttpClient,在调⽤SolrTemplate的saveBean ⽅法时就调⽤HttpClient技术。
当前⼤部分项⽬暴漏出来的接⼝是Http请求,数据格式是JSON格式,但在⼀些⽼项⽬使⽤的仍然是webService。
HttpClient 提供的主要的功能(1)实现了所有 HTTP 的⽅法(GET,POST,PUT,DELETE 等)(2)⽀持⾃动转向(3)⽀持 HTTPS 协议(4)⽀持代理服务器等1、关于Http的请求类型(常见)get、put、post、delete含义与区别1、GET请求会向数据库发索取数据的请求,从⽽来获取信息,该请求就像数据库的select操作⼀样,只是⽤来查询⼀下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产⽣副作⽤。
⽆论进⾏多少次操作,结果都是⼀样的。
2、与GET不同的是,PUT请求是向服务器端发送数据的,从⽽改变信息,该请求就像数据库的update操作⼀样,⽤来修改数据的内容,但是不会增加数据的种类等,也就是说⽆论进⾏多少次PUT操作,其结果并没有不同。
3、POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作⼀样,会创建新的内容。
⼏乎⽬前所有的提交操作都是⽤POST请求的。
4、DELETE请求顾名思义,就是⽤来删除某⼀个资源的,该请求就像数据库的delete操作。
就像前⾯所讲的⼀样,既然PUT和POST操作都是向服务器端发送数据的,那么两者有什么区别呢。
POST主要作⽤在⼀个集合资源之上的(url),⽽PUT主要作⽤在⼀个具体资源之上的(url/xxx),通俗⼀下讲就是,如URL可以在客户端确定,那么可使⽤PUT,否则⽤POST。
httpclient使用详解
httpclient使用详解Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。
因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入。
一、简介HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。
HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。
下载地址: /downloads.cgi二、特性1. 基于标准、纯净的Java语言。
实现了Http1.0和Http1.12. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
3. 支持HTTPS协议。
4. 通过Http代理建立透明的连接。
5. 利用CONNECT方法通过Http代理建立隧道的https连接。
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。
7. 插件式的自定义认证方案。
8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。
9. 连接管理器支持多线程应用。
支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
10. 自动处理Set-Cookie中的Cookie。
11. 插件式的自定义Cookie策略。
详解Idea中HTTPClient请求测试工具的使用
详解Idea中HTTPClient请求测试⼯具的使⽤前⾔:以前在本地测试⼀些接⼝,我都是使⽤postman,偶然发了Idea⾃带的请求测试⼯具HTTP Client,我就开始使⽤HTTP Client 了,但是在某些下载流类接⼝的测试中,还是要使⽤postman,但是普通的接⼝HTTP Client已经⾜够满⾜的需求。
正⽂:使⽤HTTP Client的Idea版本最好在2018以上,不然体验感不是很好。
下⾯,我将介绍⼀下,这个怎么使⽤。
1.使⽤⼊⼝:⽅式⼀:在Controller类中,⽅法旁边有⼀个⼩三⾓,如果不要携带任何参数,就可以直接点击Run HTTP Request,如果需要携带参数,点击Open in HTTP Request Editor,进⾏配置⽂件编辑(Idea 2018 以下版⾯没有此三⾓按钮)。
⽅式⼆:点击Tool,再点击HTTP Client,再点击 Test RESTful Web Service,进⼊到REST Client 窗⼝。
2.使⽤:点击Open in HTTP Request Editor,进⼊以.http结尾的配置⽂件。
使⽤⼀:Get请求,Url携带参数:使⽤⼆:Get请求,Url携带参数,并且携带Header:使⽤三: Post请求,Body中有数据,并且携带Header:application/x-www-form-urlencodedapplication/json使⽤四:根据环境变量选择执⾏参数:环境变量配置⽂件:私有的环境配置⽂件,建议不要提交Git:使⽤五:模拟登陆,获取access_token,并保存为全局变量,然后其他接⼝测试可以使⽤:使⽤六:上传⽂件:POST http://localhost:9091/uploadAccept: */*Cache-Control: no-cacheContent-Type: multipart/form-data; boundary=WebAppBoundary--WebAppBoundaryContent-Disposition: form-data; name="file"; filename="test_A.xlsx"Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet# ⽂件上传路径< C:\Users\Desktop\test_A.xlsx--WebAppBoundary--以上就是详解Idea中HTTP Client请求测试⼯具的使⽤的详细内容,更多关于Idea中HTTP Client使⽤的资料请关注其它相关⽂章!。
HttpClient_4用法由HttpClient_3升级到HttpClient_4必看
HttpClient_4用法由HttpClient_3升级到HttpClient_4必看HttpClient程序包是一个实现了HTTP 协议的客户端编程工具包,要想熟练的掌握它,必须熟悉 HTTP协议。
一个最简单的调用如下:import java.io.IOException;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.client.methods.HttpUriRequest;import org.apache.http.impl.client.DefaultHttpClient;public class Test {public static void main(String[] args) {// 核心应用类HttpClient httpClient = new DefaultHttpClient();// HTTP请求HttpUriRequest request =new HttpGet("http://localhost/index.html");// 打印请求信息System.out.println(request.getRequestLine());try {// 发送请求,返回响应HttpResponse response = httpClient.execute(request);// 打印响应信息System.out.println(response.getStatusLine());} catch (ClientProtocolException e) {// 协议错误e.printStackTrace();} catch (IOException e) {// 网络异常e.printStackTrace();}}}如果HTTP服务器正常并且存在相应的服务,则上例会打印出两行结果:GET http://localhost/index.html HTTP/1.1HTTP/1.1 200 OK核心对象httpClient的调用非常直观,其execute方法传入一个request对象,返回一个response对象。
httpclient
Header locationHeader = postMethod.getResponseHeader("location");
String location = null;
if (locationHeader != null) {
//执行getMethod
int statusCode = client.executeMethod(getMethod);
if (statusCode != HttpStatus.SC_OK) {
System.err.println("Method failed: " + getMethod.getStatusLine());
System.out.println(new String(responseBody));
下面是程序的完整代码,这些代码也可在附件中的test.GetSample中找到。
package test;
import java.io.IOException;
import mons.httpclient.*;
? 创建GET方法的实例。在GET方法的构造函数中传入待连接的地址即可。用GetMethod将会自动处理转发过程,如果想要把自动处理转发过程去掉的话,可以调用方法setFollowRedirects(false)。
GetMethod getMethod = new GetMethod("/");
// HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
// 301或者302
if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||
HttpClient使用详解与实战一:普通的GET和POST请求
HttpClient使⽤详解与实战⼀:普通的GET和POST请求简介主要特性基于标准、纯净的Java语⾔,实现了HTTP1.0和HTTP1.1。
以可扩展的⾯向对象的结构实现了HTTP全部的⽅法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
⽀持加密的HTTPS协议(HTTP通过SSL协议)。
通过HTTP代理⽅式建⽴透明的连接。
利⽤CONNECT⽅法通过HTTP代理建⽴隧道的HTTPS连接。
Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证⽅案。
插件式的⾃定义认证⽅案。
可插拔的安全套接字⼯⼚,使得接⼊第三⽅解决⽅案变得更容易连接管理⽀持使⽤多线程的的应⽤。
⽀持设置最⼤连接数,同时⽀持设置每个主机的最⼤连接数,发现并关闭过期的连接。
⾃动化处理Set-Cookie:来⾃服务器的头,并在适当的时候将它们发送回cookie。
可以⾃定义Cookie策略的插件化机制。
Request的输出流可以避免流中内容体直接从socket缓冲到服务器。
Response的输⼊流可以有效的从socket服务器直接读取相应内容。
在HTTP1.0和HTTP1.1中使⽤⽤KeepAlive来保持持久连接。
可以直接获取服务器发送的响应码和响应头部。
具备设置连接超时的能⼒。
⽀持HTTP/1.1 响应缓存。
源代码基于Apache License 可免费获取。
⼀般使⽤步骤使⽤HttpClient发送请求、接收响应,⼀般需要以下步骤。
HttpGet请求响应的⼀般步骤:1). 创建HttpClient对象,可以使⽤HttpClients.createDefault();2). 如果是⽆参数的GET请求,则直接使⽤构造⽅法HttpGet(String url)创建HttpGet对象即可;如果是带参数GET请求,则可以先使⽤URIBuilder(String url)创建对象,再调⽤addParameter(String param, String value),或setParameter(String param, String value)来设置请求参数,并调⽤build()⽅法构建⼀个URI对象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HttpClient的用法HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过HTTP 协议来访问网络资源。
Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。
通过它可以让原来很头疼的事情现在轻松的解决,例如你不再管是HTTP或者HTTPS的通讯方式,告诉它你想使用HTTPS方式,剩下的事情交给 httpclient替你完成。
首先,我们必须安装好 HttpClient。
HttpClient 可以在/commons/httpclient/downloads.html下载.HttpClient 用到了 Apache Jakarta common 下的子项目 logging,你可以从这个地址/site/downloads /downloads_commons-logging.cgi下载到 common logging,从下载后的压缩包中取出 commons-logging.jar 加到 CLASSPATH 中.HttpClient 用到了 Apache Jakarta common 下的子项目 codec,你可以从这个地址/site/downloads /downloads_commons-codec.cgi 下载到最新的 common codec,从下载后的压缩包中取出 commons-codec-1.x.jar 加到 CLASSPATH 中1.读取网页(HTTP/HTTPS)内容下面是我们给出的一个简单的例子用来访问某个页面package http.demo;import java.io.IOException;import mons.httpclient.*;import mons.httpclient.methods.*;/*** 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面* @author Liudong*/public class SimpleClient {public static void main(String[] args) throws IOException{HttpClient client = new HttpClient();//设置代理服务器地址和端口//client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port);//使用GET方法,如果服务器需要通过HTTPS连接,那只需要将下面URL中的http换成https HttpMethod method = new GetMethod("");//使用POST方法//HttpMethod method = new PostMethod("");client.executeMethod(method);//打印服务器返回的状态System.out.println(method.getStatusLine());//打印返回的信息System.out.println(method.getResponseBodyAsString());//释放连接method.releaseConnection();}}在这个例子中首先创建一个HTTP客户端(HttpClient)的实例,然后选择提交的方法是GET或者 POST,最后在HttpClient实例上执行提交的方法,最后从所选择的提交方法中读取服务器反馈回来的结果。
这就是使用HttpClient的基本流程。
其实用一行代码也就可以搞定整个请求的过程,非常的简单!2.以GET或者POST方式向网页提交参数其实前面一个最简单的示例中我们已经介绍了如何使用GET或者POST方式来请求一个页面,本小节与之不同的是多了提交时设定页面所需的参数,我们知道如果是GET的请求方式,那么所有参数都直接放到页面的URL后面用问号与页面地址隔开,每个参数用&隔开,例如:?name=liudong&mobile=123456,但是当使用POST方法时就会稍微有一点点麻烦。
本小节的例子演示向如何查询手机号码所在的城市,代码如下:NameValuePair:简单名称值对节点类NameValuePair. 摘要: 本类位于System. ... NameValuePair。
主要用途是在DBConnectionString类中,解析ConnectionString时存储并串联Name/Value对。
package http.demo;import java.io.IOException;import mons.httpclient.*;import mons.httpclient.methods.*;/*** 提交参数演示* 该程序连接到一个用于查询手机号码所属地的页面* 以便查询号码段1330227所在的省份以及城市* @author Liudong*/public class SimpleHttpClient {public static void main(String[] args) throws IOException{HttpClient client = new HttpClient();client.getHostConfiguration().setHost("", 80, "http"); HttpMethod method = getPostMethod();//使用POST方式提交数据client.executeMethod(method);//打印服务器返回的状态System.out.println(method.getStatusLine());//打印结果页面String response =new String(method.getResponseBodyAsString().getBytes("8859_1")); //打印返回的信息System.out.println(response);method.releaseConnection();}/*** 使用GET方式提交数据; * @return*/private static HttpMethod getGetMethod(){return new GetMethod("/simcard.php?simcard=1330227");}/*** 使用POST方式提交数据* @return*/private static HttpMethod getPostMethod(){PostMethod post = new PostMethod("/simcard.php");NameValuePair simcard = new NameValuePair("simcard","1330227");post.setRequestBody(new NameValuePair[] { simcard});return post;}}在上面的例子中页面/simcard.php需要一个参数是simcard,这个参数值为手机号码段,即手机号码的前七位,服务器会返回提交的手机号码对应的省份、城市以及其他详细信息。
GET的提交方法只需要在URL后加入参数信息,而POST则需要通过NameValuePair类来设置参数名称和它所对应的值.3.处理页面重定向在JSP/Servlet编程中response.sendRedirect方法就是使用HTTP协议中的重定向机制。
它与JSP中的<jsp:forward …>的区别在于后者是在服务器中实现页面的跳转,也就是说应用容器加载了所要跳转的页面的内容并返回给客户端;而前者是返回一个状态码,这些状态码的可能值见下表,然后客户端读取需要跳转到的页面的URL并重新加载新的页面。
就是这样一个过程,所以我们编程的时候就要通过HttpMethod.getStatusCode()方法判断返回值是否为下表中的某个值来判断是否需要跳转。
如果已经确认需要进行页面跳转了,那么可以通过读取HTTP头中的location属性来获取新的地址。
状态码对应HttpServletResponse的常量详细描述301SC_MOVED_PERMANENTLY页面已经永久移到另外一个新地址302SC_MOVED_TEMPORARILY页面暂时移动到另外一个新的地址303SC_SEE_OTHER客户端请求的地址必须通过另外的URL来访问307SC_TEMPORARY_REDIRECT同SC_MOVED_TEMPORARILY下面的代码片段演示如何处理页面的重定向client.executeMethod(post);System.out.println(post.getStatusLine().toString()); post.releaseConnection();//检查是否重定向int statuscode = post.getStatusCode();if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) ||(statuscode == HttpStatus.SC_MOVED_PERMANENTLY) || (statuscode == HttpStatus.SC_SEE_OTHER) || (statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) {//读取新的URL地址Header header = post.getResponseHeader("location"); if (header != null) {String newuri = header.getValue();if ((newuri == null) || (newuri.equals(""))) newuri = "/";GetMethod redirect = new GetMethod(newuri); client.executeMethod(redirect);System.out.println("Redirect:"+redirect.getStatusLine().toString());redirect.releaseConnection();} elseSystem.out.println("Invalid redirect");}我们可以自行编写两个JSP页面,其中一个页面用response.sendRedirect方法重定向到另外一个页面用来测试上面的例子。