HTTPClient用法
- 格式:rtf
- 大小:268.95 KB
- 文档页数:18
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 是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)的使⽤与总结参考: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的简单使⽤介绍当我们在开发客户端还有少部分服务端程序时,数据需要从 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 是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 提供的主要的功能,要知道更多详细的功能可以参见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使⽤注意(预热与长连接)最近在测试⼀个第三⽅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的基本使用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配置及运⽤(⼀) 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在⽅法上抛出,以简化代码格式,让其更好看。
目录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的用法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方法重定向到另外一个页面用来测试上面的例子。