HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。
http的主要功能包括:
1. 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
2. 支持自动转向
3. 支持 HTTPS 协议
4. 支持代理服务器等
使用 HttpClient 需要以下 6 个步骤:
1. 创建 HttpClient 的实例
2. 创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址
3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
4. 读 response
5. 释放连接。无论执行方法是否成功,都必须释放连接
6. 对得到后的内容进行处理
根据以上步骤,我们来编写用GET方法来取得某网页内容的代码。
HttpClient httpClient = new HttpClient(); |
GetMethod getMethod = new GetMethod(http://www.ibm.com/); |
//设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略 getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); //执行getMethod int statusCode = client.executeMethod(getMethod); if (statusCode != HttpStatus.SC_OK) { System.err.println("Method failed: " + getMethod.getStatusLine()); } //设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略 getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); //执行getMethod int statusCode = client.executeMethod(getMethod); if (statusCode != HttpStatus.SC_OK) { System.err.println("Method failed: " + getMethod.getStatusLine()); }
method.releaseConnection(); |
System.out.println(new String(responseBody)); |
完整的代码示例
public class FeedBackServiceImpl implements FeedBackService, InitializingBean { private static final Logger log = LoggerFactory.getLogger(FeedBackServiceImpl.class); private static final int CONNECTION_TIME_OUT = 1000; private static final int TIME_OUT = 2000; /** * 参数 */ private static final String PARAM_ID = "id"; private static final String PARAM_QUESTION_ID = "questionId"; private static final String PARAM_ANSWER = "answer"; private static final String PARAM_COOKIE_ID = "cookieId"; /** * 盖娅系统获取调查问卷的url */ private String feedBackQuestionaireUrl; /** * 盖娅系统保存用户反馈信息的url */ private String feedBackAnswerUrl; /** * 问卷类型与问卷id的映射 * * <pre> * 问卷类型,从前台传递过来。目前有两个取值:"1"表示进货单页面的问卷;"2"表示确认订单页面的问卷 * 问卷id,作为从盖娅系统中获取调查问卷的参数 * </pre> */ private Map<String, String> questionTypeToQuestionId = new HashMap<String, String>(); private HttpClient httpClient; public boolean addFeedBack(FeedBackModel feedBackModel) { if (feedBackModel == null) { return false; } boolean res = false; // 调用盖娅系统的接口,提交反馈 PostMethod postMethod = new PostMethod(feedBackAnswerUrl); postMethod.addParameter(PARAM_QUESTION_ID, feedBackModel.getQuestionId()); postMethod.addParameter(PARAM_ANSWER, feedBackModel.getAnswer()); postMethod.addParameter(PARAM_COOKIE_ID, feedBackModel.getCookieId()); try { int statusCode = httpClient.executeMethod(postMethod); if (statusCode != HttpStatus.SC_OK) { StringBuilder sb = new StringBuilder("fail to add feedback, requestUrl="); sb.append(feedBackAnswerUrl).append(", parameter: ").append(feedBackModel.toString()).append(", HTTP StatusCode=").append(statusCode); log.error(sb.toString()); res = false; } else { res = true; } } catch (HttpException e) { log.error("HttpException occured when addFeedBack, requestUrl=" + feedBackAnswerUrl + ", parameter: " + feedBackModel.toString(), e); res = false; } catch (IOException e) { log.error("IOException occured when addFeedBack, requestUrl=" + feedBackAnswerUrl + ", parameter: " + feedBackModel.toString(), e); res = false; } finally { postMethod.releaseConnection(); postMethod = null; } return res; } public JSONObject getQuestionaire(String questionType) { String id = questionTypeToQuestionId.get(questionType); if (StringUtil.isBlank(id)) { return null; } // 调用盖娅系统的接口,获取调查问卷 GetMethod getMethod = new GetMethod(feedBackQuestionaireUrl); NameValuePair param = new NameValuePair(PARAM_ID, id); getMethod.setQueryString(new NameValuePair[]{param}); String responseText = null; try { // 执行getMethod int statusCode = httpClient.executeMethod(getMethod); if (statusCode != HttpStatus.SC_OK) { StringBuilder sb = new StringBuilder("fail to getQuestionaire, requestUrl="); sb.append(feedBackQuestionaireUrl).append("?id=").append(id).append(", HTTP StatusCode=").append(statusCode); log.error(sb.toString()); return null; } // 读取内容 responseText = getMethod.getResponseBodyAsString(); } catch (HttpException e) { StringBuilder sb = new StringBuilder("HttpException occured when getQuestionaire, requestUrl="); sb.append(feedBackQuestionaireUrl).append("?id=").append(id); log.error(sb.toString(), e); return null; } catch (IOException e) { StringBuilder sb = new StringBuilder("IOException occured when getQuestionaire, requestUrl="); sb.append(feedBackQuestionaireUrl).append("?id=").append(id); log.error(sb.toString(), e); return null; } finally { getMethod.releaseConnection(); getMethod = null; } if (StringUtil.isBlank(responseText)) { return null; } // 从查询结果中解析出包含问卷的json字符串 int index = responseText.indexOf("="); if (index >= 0) { responseText = responseText.substring(index + 1); } try { JSONObject json = JSONObject.fromObject(responseText); return json; } catch (Exception e) { log.error("fail to change from String to JSONObject, string=" + responseText, e); return null; } } public void afterPropertiesSet() throws Exception { HttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager(); httpClient = new HttpClient(connectionManager); httpClient.setConnectionTimeout(CONNECTION_TIME_OUT); httpClient.setTimeout(TIME_OUT); }
发表评论
-
数据结构利器之私房STL
2012-12-11 10:29 0http://www.cnblogs.com/daoluanx ... -
Android xml资源文件中@、@android:type、@*、?、@+含义和区别
2011-12-28 08:48 1056一.@代表引用资源 1.引用自定义资源。格式:@[packa ... -
关于handler
2011-11-11 17:26 1175链接:Android的消息机制 ... -
常用activity跳转
2011-11-01 10:50 1622------------------------------- ... -
Activity的android:launchMode
2011-10-14 09:41 1098<activity android:launchMode ... -
android wifi
2011-10-10 10:26 1081wifi网卡的状态由一系列的整型常量来表示的: 1)、int ... -
android 蓝牙
2011-09-26 11:32 1187对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Andro ... -
XML解析之-pull解析
2011-09-09 10:07 10753Pull是Android内置的xml解析器。Pull解析器的运 ... -
XML解析之-SAX解析
2011-09-08 18:04 1466在android开发中,我们经常使用SAX解析来解析xml数据 ... -
XML解析之-XStream解析
2011-09-08 17:07 11410本例使用XStream生成一个xml文件,再发序列化xml ... -
json数据解析一
2011-09-08 11:05 1636本例用JsonReader类来解析 ... -
json数据解析二
2011-09-08 10:47 1264这一篇我们将采用Gson类来解析json数据。把json解析出 ... -
Google Map(二)
2011-09-06 19:26 1726在Google Map(一) 中,我们学习了怎么样在手机中显示 ... -
Google Map(一)
2011-09-06 18:24 1079今天学习了google map的简单开发,此篇博文主要内容是: ...
相关推荐
### httpclient使用教程 #### HttpClient概述与重要性 在当今互联网时代,HTTP协议无疑是网络通信中最常用且至关重要的协议之一。随着技术的发展,越来越多的Java应用程序需要直接通过HTTP协议访问网络资源。尽管...
在提供的压缩包文件中,"第一个版本.rar"和"第二个版本.rar"可能包含了不同的HttpClient使用示例或者不同版本的代码。你可以解压并查看这些文件,以便更深入地理解和学习HttpClient的具体用法。每个版本可能包含不同...
《HttpClient使用详解》 HttpClient是Apache软件基金会的 HttpClient项目提供的一款强大的HTTP客户端工具,它允许开发者在Java应用程序中实现复杂的HTTP通信。这份8页的PDF文档深入解析了HttpClient的使用方法,...
### HttpClient 使用指南知识点详解 ...以上是基于提供的部分内容对HttpClient使用指南的相关知识点进行了详细说明。通过这些知识点的学习,可以更好地理解和掌握HttpClient的工作原理及其在实际开发中的应用。
在本示例中,我们将关注“httpclient使用post方法上传多个图片和其他参数的demo源码”,这是一个涉及到文件上传和参数传递的重要场景。 在Web开发中,POST方法常用于向服务器提交数据,比如表单数据或文件。...
这篇博客文章《HttpClient使用》(链接:https://leesonhomme.iteye.com/blog/491095)可能涵盖了HttpClient的基本用法和一些实用技巧。由于没有具体的描述,我们将基于HttpClient的一般知识点进行详细介绍。 1. **...
使用httpClient进行代理
Http协议使用封装jar包(commons-codec-1.3.jar、commons-httpclient-3.1.jar、commons-logging-1.1.jar) 简单使用方法: public static void main(String[] args) { // String str1 = "...;...
httpclient是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,本文档提供使用httpclient的使用方法
1. **导入依赖**:在Java项目中使用HttpClient,你需要先将所需的jar文件添加到类路径中。描述中的"所使用的jar.zip"可能包含了HttpClient的库文件,如httpclient、httpcore等。确保导入了这些库,才能使用...
1. **创建HttpClient对象**:这是发送请求的基础,通常使用`HttpClient`类的实例。 2. **创建请求方法**:根据需求创建`HttpGet`或`HttpPost`对象,分别对应GET和POST请求。 3. **设置请求参数**:可以通过`set...
2. **请求和响应模型**:HttpClient使用HttpRequest和HttpResponse对象封装HTTP请求和响应,便于处理请求头、请求体和响应头、响应体。 3. **身份验证和安全**:HttpClient支持多种身份验证机制,包括基本认证、...
在HttpClient的使用中,我们首先需要了解几个核心组件: 1. **HttpClient实例**:这是整个HTTP通信的基础,通过`HttpClientBuilder`创建,可以设置各种配置,如连接超时、重试策略等。 2. **HttpRequestBase**:这...