public void urlPostJson(String url,String desc,String json) {
log.info("-----------------------------"+desc+" Request: " + json);
HttpClient client = new HttpClient();
client.getHostConfiguration().setProxy("127.0.0.1", 5689);
client.getHttpConnectionManager().getParams().setConnectionTimeout(3000);// client.setConnectionTimeout(3000);
client.getParams().setSoTimeout(3000);// client.setTimeout(1000);
client.getParams().setConnectionManagerTimeout(1000);
PostMethod method = new PostMethod(url);
try {
// method.setRequestHeader("Content-Type", " application/json; charset=UTF-8");
method.setRequestBody(new ByteArrayInputStream(json.getBytes("UTF-8")));
// method.setRequestBody(json);
int status = client.executeMethod(method);
String res=method.getResponseBodyAsString();
log.info(" status:"+status+" Resonse: "+res);
} catch (IOException e) {
log.error("HttpClient.executeMethod(postMethod) IOException!",e);
}finally{
if (method != null) {
method.releaseConnection();
}
}
}
1. 建立HttpClient对象。2. 构造Http 请求对象。3. 执行HttpClient对象的execute方法,将Http请求对象做为该方法的参数。4. 读取execute方法返回的HttpResponse结果并解析。五、释放链接。整个过程是否是与咱们平时在浏览器上访问相似呢。惟一区别是不能执行HTTP页面中签入嵌入的JS代码,天然也不会对页面内容进行任何解析、处理,这些都是须要开发人员来完成的。在以上代码中,httpclient的初始化没有看到任何参数设置,实际上是在它的构造函数里调用了接口,并设置了默认值,以下包含协议版本、客户端引擎、cookie策略等,若是要本身设置,能够经过它的成员变量httpClientParams对象进行设置。html

一、关于重定向。
http多种状态已经在HttpStatus这个类中定义好,其中重定向 根据RFC2616中对自动转向的定义,主要有两种:301和302。301表示永久的移走(Moved Permanently),当返回的是301,则表示请求的资源已经被移到一个固定的新地方,任何向该地址发起请求都会被转到新的地址上。302表示暂时的转向,好比在服务器端的servlet程序调用了sendRedirect方法,则在客户端就会获得一个302的代码,这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。若是是get方式请求,httpclient是自动帮你重定向并拿到响应信息,也能够经过设置
method
.
setFollowRedirects
(
false
)不自动转。post的请求是不能自动跳转的,须要从头部信息中拿到Location(多是相对路径)所以须要对location返回的值作一些处理才能够发起向新地址的请求。
二、字符编码
客户端发送的数据多样,最终全部数据都是经过最底层的物理层面的电信号来传递,首部字段content-type 说明了实体主体内对象的媒体类型,即服务器经过contentType来知道这个是什么样子的数据。客户端在拿到服务器返回的数据后,根据头部设置的可接收媒体类型进行内容协商,返回最适合的资源。对于有中文的请求,为避免出现乱码,最好设置content-type。在上部分的代码截图,你们能够看到,若是咱们本身不设置contentType 那么默认会采用ISO的方式进行传输,那么若是与你实际的编码方式不一致的话,服务器就会拿到一个乱码,从而没法正常的响应。能够经过上面代码进行设置,也能够经过
method.setRequestHeader("Content-Type", " application/json; charset=UTF-8")来进行设置
三、cookie
httpclient默认的cookie策略是
RFC_2109其中能够经过去更改。请求过程当中能够经过sendHead 把cookie放入头部,并传到后端进行访问。
总结:
基本上使用httpclient过程当中,主要操做的类有:httpclient,getMethod,postMethod,httpClientParams,httpConnectionManager这几个。详见如下的类图。
HttpClient表明了一个http的客户端,HttpConnectionManager是用来管理HttpConnection 的,HttpConnection表明了一个http链接,因此HttpConnectionManager其实质上也就是一个http链接池,管理这些 http链接(和数据库链接池一个道理)。HttpMethod表明了一个Http方法,一个HttpClient能够运行多个HttpMethod(实 质上,httpclient执行一个HttpMethod时,会从connectionmanager那里获取一个httpconnection,在此 connection上执行该method,执行完该method后,让method 释放该httpconnection,从而将该httpconnection返回给connectionmanager,以便供后续的method使 用)
因此在httpclient链接后资源释放问题很重要,就跟咱们用database connection要释放资源同样。
四、小tips
一、fidder做为一款强大好用的web调试利器,针对commons下的httpclient能够以下设置代理,能帮你记录下请求和响应的全部信息。 接口测试中遇到异常方便查看,减小本身debug的状况。
五、扩展
httpclient功能之强大,不是一篇文章可以说完。其余的,例如文件上传、DNS配置、多线程下的httpclient使用。过程当中须要你对http协议、cookie-session机制有必定的认识基础。本篇文件旨在用作一些简单接口的测试,目前commons这个版本已经不作更新了,若是有更复杂的接口,仍是推荐使用org.apache.http.impl.client下的httpclient。