前记

最近有个需求,需要根据商品id获取商品详情: 首先想到的是在浏览器里输入url按回车就可以了;或者在linux中使用curl+url来发起一个http请求; 但如果是要在java程序中发出http请求,该如何实现呢?

一. httpClient初认识

      虽然JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。

HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包。

二.  httpClient使用

 1. 引入maven依赖

    

  1. <dependency>
  2. <groupId>org.apache.httpcomponents</groupId>
  3. <artifactId>httpcomponents-client</artifactId>
  4. <version>4.3</version>
  5. </dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcomponents-client</artifactId>
<version>4.3</version>
</dependency>

 2. GET方法代码框架 

  1. import java.io.IOException;
  2. import org.apache.commons.httpclient.*;
  3. import org.apache.commons.httpclient.methods.GetMethod;
  4. import org.apache.commons.httpclient.params.HttpMethodParams;
  5. public class GetSample{
  6. public static void main(String[] args) {
  7. //step1: 构造HttpClient的实例,类似于打开浏览器
  8. HttpClient httpClient = new HttpClient();
  9. //step2: 创建GET方法的实例,类似于在浏览器地址栏输入url
  10. GetMethod getMethod = new GetMethod("http://www.ibm.com");
  11. // 使用系统提供的默认的恢复策略
  12. getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
  13. new DefaultHttpMethodRetryHandler());
  14. try {
  15. //step3: 执行getMethod 类似于点击enter,让浏览器发出请求
  16. int statusCode = httpClient.executeMethod(getMethod);
  17. if (statusCode != HttpStatus.SC_OK) {
  18. System.err.println("Method failed: "
  19. + getMethod.getStatusLine());
  20. }
  21. //step4: 读取内容,浏览器返回结果
  22. byte[] responseBody = getMethod.getResponseBody();
  23. //处理内容
  24. System.out.println(new String(responseBody));
  25. } catch (HttpException e) {
  26. //发生致命的异常,可能是协议不对或者返回的内容有问题
  27. System.out.println("Please check your provided http address!");
  28. e.printStackTrace();
  29. } catch (IOException e) {
  30. //发生网络异常
  31. e.printStackTrace();
  32. } finally {
  33. //释放连接 (一定要记住)
  34. getMethod.releaseConnection();
  35. }
  36. }
  37. }
import java.io.IOException;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
public class GetSample{
public static void main(String[] args) {
//step1: 构造HttpClient的实例,类似于打开浏览器
HttpClient httpClient = new HttpClient();
//step2: 创建GET方法的实例,类似于在浏览器地址栏输入url
GetMethod getMethod = new GetMethod("http://www.ibm.com");
// 使用系统提供的默认的恢复策略
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());
try {
//step3: 执行getMethod 类似于点击enter,让浏览器发出请求
int statusCode = httpClient.executeMethod(getMethod);
if (statusCode != HttpStatus.SC_OK) {
System.err.println("Method failed: "
+ getMethod.getStatusLine());
}
//step4: 读取内容,浏览器返回结果
byte[] responseBody = getMethod.getResponseBody();
//处理内容
System.out.println(new String(responseBody));
} catch (HttpException e) {
//发生致命的异常,可能是协议不对或者返回的内容有问题
System.out.println("Please check your provided http address!");
e.printStackTrace();
} catch (IOException e) {
//发生网络异常
e.printStackTrace();
} finally {
//释放连接 (一定要记住)
getMethod.releaseConnection();
}
}
}

遇到的异常

org.apache.commons.httpclient.ProtocolException:The server x.x.x.x failed to respond with a valid HTTP response

   java.net.SocketException:Connection reset

   java.lang.IllegalStateException:Connection is not open

   java.io.IOException: Stream closed


java.net包里定义的异常摘录

BindException:试图将套接字绑定到本地地址和端口时发生错误的情况下,抛出此异常。

例如,当web应用已经启动,8080端口已经占用,再打算启动时会报该异常

ConnectException:试图将套接字连接到远程地址和端口时发生错误的情况下,抛出此异常。

远程地址和端口而上一个异常是本地地址和端口

HttpRetryException:抛出此异常指示 HTTP 请求需要重试,但由于启用了流模式而无法自动重试

ProtocolException:抛出此异常指示在底层协议中存在错误,如 TCP 错误

SocketException:抛出此异常指示在底层协议中存在错误,如 TCP 错误

SocketTimeoutException:如果在读取或接受套接字时发生超时,则抛出此异常

MalformedURLException:抛出这一异常指示出现了错误的 URL。

参考资料

官方文档:http://hc.apache.org/httpcomponents-client-4.2.x/index.html
http://www.ibm.com/developerworks/cn/opensource/os-httpclient/ 
http://laohuang.iteye.com/blog/55613

httpClient使用总结的更多相关文章

  1. HttpClient的替代者 - RestTemplate

    需要的包 ,除了Spring的基础包外还用到json的包,这里的数据传输使用json格式 客户端和服务端都用到一下的包 <!-- Spring --> <dependency> ...

  2. 关于微软HttpClient使用,避免踩坑

    最近公司对于WebApi的场景使用也越来越加大了,随之而来就是Api的客户端工具我们使用哪个?我们最常用的估计就是HttpClient,在微软类库中命名空间地址:System.Net.Http,是一个 ...

  3. 使用HttpClient的优解

    新工作入职不满半周,目前仍然还在交接工作,适应环境当中,笔者不得不说看别人的源码实在是令人痛苦.所幸今天终于将大部分工作流畅地看了一遍,接下来就是熟悉框架技术的阶段了. 也正是在看源码的过程当中,有一 ...

  4. Java的异步HttpClient

    上篇提到了高性能处理的关键是异步,而我们当中许多人依旧在使用同步模式的HttpClient访问第三方Web资源,我认为原因之一是:异步的HttpClient诞生较晚,许多人不知道:另外也可能是大多数W ...

  5. 揭秘Windows10 UWP中的httpclient接口[2]

    阅读目录: 概述 如何选择 System.Net.Http Windows.Web.Http HTTP的常用功能 修改http头部 设置超时 使用身份验证凭据 使用客户端证书 cookie处理 概述 ...

  6. C#中HttpClient使用注意:预热与长连接

    最近在测试一个第三方API,准备集成在我们的网站应用中.API的调用使用的是.NET中的HttpClient,由于这个API会在关键业务中用到,对调用API的整体响应速度有严格要求,所以对HttpCl ...

  7. HttpClient调用webApi时注意的小问题

    HttpClient client = new HttpClient(); client.BaseAddress = new Uri(thisUrl); client.GetAsync("a ...

  8. HttpClient相关

    HTTPClient的主页是http://jakarta.apache.org/commons/httpclient/,你可以在这里得到关于HttpClient更加详细的信息 HttpClient入门 ...

  9. Atitit.http httpclient实践java c# .net php attilax总结

    Atitit.http httpclient实践java c# .net php attilax总结 1. Navtree>> net .http1 2. Httpclient理论1 2. ...

  10. 使用httpclient发送get或post请求

    HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建 ...

随机推荐

  1. win7 系统 右键很慢

    一般都是显卡驱动造成的, 在桌面按右键反应慢,通常都是显卡驱动程序惹的祸,最最简单有效的办法就是:开始--运行--. 运行regsvr32 /u igfxpph.dll

  2. WCF中的异步实现

    对于WCF中通讯的双方来说,客户端可以异步的调用服务:服务端对服务也能以异步的方式实现. 目录: 1.WCF客户端异步调用服务 2.服务端的异步实现 WCF客户端异步调用服务主要通过生成异步的代理类, ...

  3. 死磕 java集合之终结篇

    概览 我们先来看一看java中所有集合的类关系图. 这里面的类太多了,请放大看,如果放大还看不清,请再放大看,如果还是看不清,请放弃. 我们下面主要分成五个部分来逐个击破. List List中的元素 ...

  4. PowerShell让系统可以执行.ps1文件,开机,关机,在线时间 , Function自定义函数

    Function Get-ComputerUptimeHistory { $q=' <QueryList> <Query Id="0" Path="Sy ...

  5. iOS 对overflow:scroll使用

    让子标签的高度在初始化的时候就比父标签大,可以设置height: 101%:这样就出发了内置的scrollview的滚动. -webkit-overflow-scrolling:touch;可以让滚动 ...

  6. iOS微信页面 长按图片出现【存储图像】和【拷贝】不出现【发送朋友】【保存图片】

    最近遇到一大坑.微信加载的页面中出现图片,长按图片时不出现默认的菜单[发送朋友]等而是[存储图像]和拷贝. 原因:正常在页面中长按图片是没有问题的,但是如果你的页面嵌入了ifram然后又长按在ifra ...

  7. spring mvc 配置运行报错误

    四月 06, 2015 10:51:18 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server version: Ap ...

  8. Python_高阶函数、装饰器(decorator)

    一.变量: Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来. 对变量赋值x = y是把变量 ...

  9. apropos - 在 whatis 数据库中查找字符串

    总览 (SYNOPSIS) apropos keyword ... 描述 (DESCRIPTION) apropos 命令在一些特定的包含系统命令的简短描述的数据库文件里查找关键字, 然后把结果送到标 ...

  10. WPF知识点--自定义Button(ControlTemplate控件模板)

    ControlTemplate是一种控件模板,可以通过它自定义一个模板来替换掉控件的默认模板以便打造个性化的控件. ControlTemplate包含两个重要的属性:VisualTree 该模板的视觉 ...