HttpClient学习总结.docx

上传人:wux****ua 文档编号:9696734 上传时间:2020-04-07 格式:DOCX 页数:6 大小:42.06KB
返回 下载 相关 举报
HttpClient学习总结.docx_第1页
第1页 / 共6页
HttpClient学习总结.docx_第2页
第2页 / 共6页
HttpClient学习总结.docx_第3页
第3页 / 共6页
点击查看更多>>
资源描述
一、 HttpClient 功能简介l 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD,OPTIONS,TRACE)l 支持自动转向l 支持 HTTPS 协议l 透明地穿过HTTP代理建立连接l 通过CONNECT方法,利用通过建立穿过HTTP代理的HTTPS连接l 利用本地Java socket,透明地穿过SOCKS(版本5和4)代理建立连接l 支持利用Basic、Digest和NTLM加密的认证l 支持用于上传大文件的Multi-Part表单POST方法l 插件式安全socket实现,易于使用第三方的解决方案l 连接管理,支持多线程应用,支持设定单个主机总连接和最高连接数量,自动检测和关闭失效的连接 l 直接将请求信息流送到服务器的端口l 直接读取从服务器的端口送出的应答信息l 支持HTTP/1.0中用KeepAlive和HTTP/1.1中用persistance设置的持久连接l 直接访问由服务器送出的应答代码和头部信息l 可设置连接超时时间l HttpMethods 实现Command Pattern,以允许并行请求或高效连接复用l 遵循the Apache Software License协议,源码免费可得二、 环境搭建1. HttpClient 3.1 所需的基本jar包:commons-httpclient-3.1.jar,下载地址:http:/archive.apache.org/dist/httpcomponents/commons-httpclient/binary/;commons-logging.jar,下载地址:http:/commons.apache.org/logging/download_logging.cgi;commons-codec.jar,下载地址:http:/commons.apache.org/codec/download_codec.cgi;2. HttpClient 4所需的基本jar包:下载地址:http:/hc.apache.org/downloads.cgi;最新版本为4.1.2,且官方不再升级HttpClient3。三、 HttpClient 3.x 基本功能的使用1. 使用 HttpClient 需要以下 6 个步骤:l 创建 HttpClient 的实例l 创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址l 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例l 读 responsel 释放连接。无论执行方法是否成功,都必须释放连接l 对得到后的内容进行处理2. 使用Get方式提交请求2.1 创建HttpClient实例。大部分情况下 HttpClient 默认的构造函数已经足够使用。HttpClient httpClient = new HttpClient();2.2 创建GET方法的实例。在GET方法的构造函数中传入待连接的地址即可。GetMethod getMethod = new GetMethod(http:/www.baidu.com/);2.3 调用实例httpClient的executeMethod方法来执行getMethod。由于是执行在网络上的程序,在运行executeMethod方法的时候,需要处理两个异常,分别是HttpException和IOException。引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,比如不小心将http写成htp,或者服务器端返回的内容不正常等,并且该异常发生是不可恢复的;第二种异常一般是由于网络原因引起的异常,对于这种异常 (IOException),HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。HttpClient的恢复策略可以自定义(通过实现接口HttpMethodRetryHandler来实现)。通过httpClient的方法setParameter设置你实现的恢复策略。executeMethod返回值是一个整数,表示了执行该方法后服务器返回的状态码,该状态码能表示出该方法执行是否成功、需要认证或者页面发生了跳转(默认状态下GetMethod的实例是自动处理跳转的)等。/设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(); /执行getMethodint statusCode = client.executeMethod(getMethod);if (statusCode != HttpStatus.SC_OK) System.err.println(Method failed: + getMethod.getStatusLine();2.4 在返回的状态码正确后,即可取得内容。取得目标地址的内容有三种方法:第一种,getResponseBody(),该方法返回的是目标的二进制的byte流;第二种,getResponseBodyAsString(),这个方法返回的是String类型;第三种,getResponseBodyAsStream(),这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。byte responseBody = method.getResponseBody();2.5 释放连接。无论执行方法是否成功,都必须释放连接。method.releaseConnection();2.6 处理内容。System.out.println(new String(responseBody);3. 使用Post方式提交请求3.1 使用post的方式提交请求,步骤与get方式类似,只是声明方法实例的时候,使用的是PostMethod。PostMethod postMethod = new PostMethod (url);3.2 传递参数当我们需要使用post方式提交表单时,可以使用类NameValuePair表示表单中的域;该类的构造函数第一个参数是域名,第二参数是该域的值;将表单所有的值设置到PostMethod中用方法setRequestBody。例如:NameValuePair nameValuePair = new NameValuePair(mob,1330227);/将参数放入post方法中去post.setRequestBody(new NameValuePair nameValuePair );如果传递多个参数,可以使用逗号隔开,即可。4. 使用HttpClient3遇到的一些问题及解决方法4.1 字符编码问题。4.1.1有时候,当我们传递的参数中含有中文的时候,使用httpclient发送,web服务器无法识别,如果返回的http响应头中含有中文字符,也会出现乱码。解决的方法是修改httpclient的参数。httpClient.getParams().setHttpElementCharset(UTF-8);4.1.2 有时候,服务器返回的页面内容出现中文乱码,可以设置如下参数:httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, UTF-8);4.2超时的设置4.2.1连接超时设置httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);4.2.2读取信息超时设置httpClient.getHttpConnectionManager().getParams().setSoTimeout(1000);4.3 自定义恢复策略正如前文所说,当出现IOException异常时,httpclient可以根据我们指定的恢复策略自动试着重新执行executeMethod方法。如果我们不想让httpclient重新执行executeMethod(),或是不想让它重新执行3次,可以如下设置:/不重试getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler(0,false); /重试1次getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(1,true);我们也可以自定义恢复策略,通过实现HttpRequestRetryHandler接口,执行自定义的行为。4.4 重定向问题 Httpclient的get的方法支持自动转向处理,而post方法不支持。当然我们也可以取消掉httpclient的自动转向处理,可以调用方法: getMethod.setFollowRedirects(false)。我们可以根据执行过http方法后,根据得到的返回状态进行自定义处理。如果得到301代码,这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。可以通过以下方法读取新的url:String newurl = method.getResponseHeader(location).getValue();一些常见的http状态码及含义:200 获取到页面 HttpStatus.SC_OK301 永久移动. HttpStatus.SC_MOVED_PERMANENTLY302 临时移动. HttpStatus.SC_MOVED_TEMPORARILY303 See Other. HttpStatus.SC_SEE_OTHER307 临时重定向. HttpStatus.SC_TEMPORARY_REDIRECT4.5 设置代理 有些网站要浏览器才可以访问,但程序可以仿浏览器,主要是设置http头。 /设置代理服务器的ip地址和端口 httpClient.getHostConfiguration().setProxy(ip,port);/设置http头 List headers = new ArrayList(); headers.add(new Header(User-Agent,Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1);httpClient.getHostConfiguration().getParams().setParameter(http.default-headers, headers);四、 HttpClient 4.x基本功能的使用1. 使用Get方式提交请求1.1创建httpclient实例 HttpClient httpclient = new DefaultHttpClient();1.2构建get方法实例 HttpGet httpget = new HttpGet(http:/www.baidu.com/);1.3 执行方法,获得响应 HttpResponse response = httpclient.execute(httpget);HttpEntity entity = response.getEntity();1.4处理得到的http实体 System.out.println(EntityUtils.toString(entity);/以String形式获取内容 EntityUtils. toByteArray(entity)/以二进制byte流形式entity.getContent()/流的形式1.5 释放连接资源(必须执行的) httpClient.getConnectionManager().shutdown();2. 使用Post方式提交请求(参考HttpClient 教程 (一).htm)2.1除了构建方法使用的是:HttpPost httppost = new HttpPost(http:/www.baidu.com/);其他的步骤与使用get方式相同。2.2 传递参数许多应用程序需要频繁模拟提交一个HTML表单的过程,比如,为了来记录一个Web应用程序或提交输出数据。HttpClient提供了特殊的实体类UrlEncodedFormEntity来这个满足过程。List formparams = new ArrayList();formparams.add(new BasicNameValuePair(param1, value1);formparams.add(new BasicNameValuePair(param2, value2);UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, UTF-8);HttpPost httppost = new HttpPost(http:/localhost/handler.do);httppost.setEntity(entity);3. 使用HttpClient4遇到的一些问题及解决方法3.1 字符编码3.1.1参数中文乱码解决: Get方式提交的乱码处理:l 对中文参数使用URLEncoder.encode(src);来编码; l 设置GetMethod编码格式为utf-8:get_method.addRequestHeader(Content-type , text/html; charset=utf-8); Post方式提交的乱码处理:UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, UTF-8);3.1.2 内容中文乱码处理:EntityUtils.toString(entity,utf-8);3.2超时设置httpClient.getParams().setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,5000);/连接超时httpclient.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT,5000);/读取超时3.3自定义请求重试设置见HttpClient 教程 (一).htm 4. 附1:使用get方式,获取百度首页内容public static String gestDemos() throws HttpException, IOException String url = http:/www.baidu.com/;HttpClient httpClient = new HttpClient();/创建方法实例HttpMethod get = new GetMethod(url);/执行get方法httpClient.executeMethod(get);/获取返回的页面内容String content = get.getResponseBodyAsString();/释放链接资源get.releaseConnection();return content;5. 附2:使用post方式,提交参数,查询手机归属地 public static String post() HttpClient httpClient = new DefaultHttpClient();String url = http:/haoma.imobile.com.cn/index.php;List nameValuePair = new ArrayList();nameValuePair.add(new BasicNameValuePair(mob, 1330227);try /声明一个url-encoded 实体UrlEncodedFormEntity urlEntity = new UrlEncodedFormEntity(nameValuePair,utf-8);/声明使用post的方法提交请求HttpPost post = new HttpPost(url);post.setEntity(urlEntity);/执行post请求HttpResponse response = httpClient.execute(post);/获取响应实体HttpEntity entity = response.getEntity();String content = ;if (entity != null) System.out.println(=服务器返回内容=);content = EntityUtils.toString(entity,utf-8);return content;catch (Exception e) System.out.println(-Exception-);e.printStackTrace();return null;finally/关闭连接资源httpClient.getConnectionManager().shutdown();
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!