HttpClient 工具类
参考自 http://www.aichengxu.com/view/2337969
https单向认证,会自动去除域名校验;而双向认证需要在执行execute之前需要设置证书调用setJks方法。
关于Session保持有两种实现方式:
def http = HttpClient.get(url1)
....
http.post(url2) 或者 http = HttpClient.post(url2, http)
....
http.shutdown()
示例1:String url = "http://www.baidu.com/s"
def http = HttpClient.get(url)
http.addParameter("wd", "java 核心技术")
http.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1 WOW64 rv:39.0) Gecko/20100101 Firefox/39.0")
//http.setProxy("10.10.12.62", 3128) //设置代理
def response = http.execute() //执行请求
println response.getString() //输出内容
response.transferTo("d:/baidu-search-java.html") //输出到文件
http.shutdown()
示例2,代理模式:String url = "http://www.baidu.com/"
HttpClient.request(url, request).execute().render(response).shutdown()
示例3,POST 一段 JSON、并且接收返回的 JSON 数据:HttpClient.post (url)
//.setContentType(HttpClient.ContentType.APPLICATION_JSON)
//.setParameter(StringUtils.toJson([x: 1, y: 2], Map))
.setParameterJson(StringUtils.toJson([x: 1, y: 2], Map))
.execute().getJson(Map)
示例4,POST 参数 + 附件(注意中文)、并且接收返回的 JSON 数据:HttpClient.post (url)
.addParameter("yyyyy", "yyyyyyyyyyyyy对对对")
.addParameter("zzzz在", "啧啧啧123")
.addFiles("xxxx", [new File("/dev/shm/ramdisk/添加亲友关系.txt")])
.addParameter("zhh", "啧啧啧123")
.execute().getJson(Map)
后台代码示例:println request.getContentType()
println request.JSON
println params
println params.xxxx.originalFilename // 可以取到一个附件,多个附件用下面的方式
MultipartHttpServletRequest mrequest = ServletUtils.getMultipartRequest(request)
if (mrequest != null) {
for (String field in mrequest.getFileMap().keySet()) {
for (MultipartFile f in mrequest.getFiles(field)) {
println f.originalFilename + " --- " + f.name + " --- " + f.contentType
\
\}\
\}\
}
| Modifiers | Name | Description |
|---|---|---|
static class |
HttpClient.ContentType |
// * 把Json转换成List
// * @return
//
|
static class |
HttpClient.ResponseWrap |
响应结果 |
| Type | Name and description |
|---|---|
HttpClient |
addCookie(org.apache.http.cookie.Cookie... cookies)添加 Cookie |
HttpClient |
addCookies(Map<String, String> cookies)添加 Cookie |
HttpClient |
addFiles(String name, Map<String, Object> files)添加附件,并设置 ContentType 为 multipart/form-data,charset=UTF-8 |
HttpClient |
addFiles(String name, List<java.io.File> files)添加附件,并设置 ContentType 为 multipart/form-data,charset=UTF-8 |
HttpClient |
addHeader(String name, String value)添加 Header |
HttpClient |
addHeaders(Map<String, String> headers)添加 Header |
HttpClient |
addParameter(String name, String value)// * 创建post请求 // * @return //
|
HttpClient |
addParameters(Map<String, Object> parameters)添加参数 |
boolean |
containsHeader(String name)是否存在指定 name 的 Header |
static HttpClient |
delete(String url, HttpClient other = null)创建 delete 请求 |
HttpClient.ResponseWrap |
execute()执行请求 |
Thread |
execute(Closure done, Closure failed = null)异步执行请求 |
T |
execute(org.apache.http.client.ResponseHandler<? extends T> responseHandler)执行请求 |
static HttpClient |
get(String url, HttpClient other = null)创建 get 请求 |
org.apache.http.Header[] |
getAllHeaders()获取所有 Header |
org.apache.http.ProtocolVersion |
getProtocolVersion()获取协议版本信息 |
java.net.URI |
getURI()获取请求 Url |
org.apache.http.HeaderIterator |
headerIterator()获取 Header 的迭代器 |
HttpClient |
maxRedirects(int maxRedirects)设置重定向的次数 |
static HttpClient |
post(String url, HttpClient other = null)创建 post 请求 |
static HttpClient |
put(String url, HttpClient other = null)创建 put 请求 |
HttpClient |
removeHeader(String name, String value)// * 移除指定的Header // * @param header // |
HttpClient |
removeHeaders(String name)移除指定 name 的 Header 列表 |
static HttpClient |
request(String url, javax.servlet.http.HttpServletRequest req, HttpClient other = null)根据当前浏览器的 http 请求,创建相应类型的请求 |
HttpClient |
setCircularRedirectsAllowed(boolean circularRedirectsAllowed)设置是否允许服务端循环重定向 |
HttpClient |
setConnectTimeout(int connectTimeout)设置和服务器建立连接的超时时间,单位:ms |
HttpClient |
setConnectionRequestTimeout(int connectionRequestTimeout)设置从连接池获取连接的超时时间,单位:ms |
HttpClient |
setContentEncoding(String encoding)设置内容编码 |
HttpClient |
setContentType(String mimeType, java.nio.charset.Charset charset)设置 ContentType |
HttpClient |
setContentType(String contentType)设置 ContentType |
HttpClient |
setContentType(org.apache.http.entity.ContentType contentType)设置 ContentType |
HttpClient |
setCookieStore(java.net.CookieStore cookieStore)设置一个 CookieStore |
HttpClient |
setHeaders(Map<String, String> headers)设置 Header,会覆盖所有之前的 Header |
HttpClient |
setHeaders(org.apache.http.Header[] headers) |
HttpClient |
setJKS(String jksFilePath, String password)设置双向认证的JKS |
HttpClient |
setJKS(java.io.File jksFile, String password)设置双向认证的JKS |
HttpClient |
setJKS(java.io.InputStream instream, String password)设置双向认证的JKS, 不会关闭InputStream |
HttpClient |
setJKS(java.security.KeyStore keyStore)设置双向认证的JKS |
HttpClient |
setParameter(java.io.File file)设置请求参数,会清空并覆盖之前的参数、并设置 ContentType 为 application/octet-stream |
HttpClient |
setParameter(byte[] binary)设置请求参数,会清空并覆盖之前的参数、并设置 ContentType 为 application/octet-stream |
HttpClient |
setParameter(java.io.Serializable serializable)设置请求参数,会清空并覆盖之前的参数、并设置 ContentType 为 application/octet-stream |
HttpClient |
setParameter(java.io.InputStream stream)// * 设置参数为Json对象 // * @return //
|
HttpClient |
setParameter(java.io.PipedOutputStream pipedOutputStream, Closure inputThread = null)设置请求参数,会清空并覆盖之前的参数、并设置 ContentType 为 application/octet-stream |
HttpClient |
setParameter(String text)设置请求参数,会清空并覆盖之前的参数 |
HttpClient |
setParameterJson(String json)设置 json 格式的请求参数、并设置 ContentType 为 "application/json,charset=UTF-8",会清空并覆盖之前的参数 |
HttpClient |
setParameterXml(String xml)设置 xml 格式的请求参数、并设置 ContentType 为 "application/xml,charset=UTF-8",会清空并覆盖之前的参数 |
HttpClient |
setParameters(Map<String, Object> parameters)// * 添加参数 // * @return //
|
HttpClient |
setProxy(String hostname, int port)设置网络代理 |
HttpClient |
setProxy(String hostname, int port, String schema)设置网络代理 |
HttpClient |
setProxy(java.net.InetAddress address)设置网络代理 |
HttpClient |
setProxy(org.apache.http.HttpHost host)设置网络代理 |
HttpClient |
setRedirectsEnabled(boolean redirectsEnabled)设置是否启用调转 |
HttpClient |
setRequest(javax.servlet.http.HttpServletRequest req)根据当前浏览器的 http 请求,会覆盖之前的 headers、cookies 和 request body(仅支持post/put),类似于代理。 |
HttpClient |
setSocketTimeout(int socketTimeout)设置从服务器获取返回数据的超时时间,单位:ms |
HttpClient |
setTimeout(Integer socketTimeout, Integer connectTimeout = null, Integer connectionRequestTimeout = null)设置超时时间(毫秒) |
HttpClient |
setURI(java.net.URI uri)设置请求 Url |
HttpClient |
setURI(String uri)设置请求 Url |
void |
shutdown()关闭连接 |
| Methods inherited from class | Name |
|---|---|
class Object |
Object#wait(long, int), Object#wait(long), Object#wait(), Object#equals(Object), Object#toString(), Object#hashCode(), Object#getClass(), Object#notify(), Object#notifyAll() |
复用当前客户端,创建一个新的 delete 请求
url - 请求地址复用当前客户端,创建一个新的 get 请求
url - 请求地址复用当前客户端,创建一个新的 post 请求
url - 请求地址复用当前客户端,创建一个新的 put 请求
url - 请求地址复用当前客户端,并根据当前浏览器的 http 请求,创建一个新的请求
url - 请求地址添加 Cookie
添加 Cookie
添加附件,并设置 ContentType 为 multipart/form-data,charset=UTF-8
只支持 post、put 操作,并且会清空之前设置的非键值对形式的参数(如 file、stream、text、serializable 等)。
name - 附件域的名称files - 键为文件名、值为文件路径/文件对象/InputStream/byte[] 的多个文件添加附件,并设置 ContentType 为 multipart/form-data,charset=UTF-8
只支持 post、put 操作,并且会清空之前设置的非键值对的参数(如 file、stream、text、serializable 等)。
name - 附件域的名称files - 文件列表添加 Header
添加 Header
// * 创建post请求 // *
uri - 请求地址
// *添加参数
是否存在指定 name 的 Header
创建 delete 请求
url - 请求地址执行请求
异步执行请求
done - 执行成功的回调闭包,可接收一个 ResponseWrap 参数failed - 实现失败的回调闭包,可接收一个 IOException 参数执行请求
创建 get 请求
url - 请求地址获取所有 Header
获取协议版本信息
获取请求 Url
获取 Header 的迭代器
设置重定向的次数
创建 post 请求
url - 请求地址创建 put 请求
url - 请求地址// * 移除指定的Header // *
移除指定 name 的 Header 列表
根据当前浏览器的 http 请求,创建相应类型的请求
url - 请求地址设置是否允许服务端循环重定向
设置和服务器建立连接的超时时间,单位:ms
设置从连接池获取连接的超时时间,单位:ms
设置内容编码
只支持未添加过附件的 post、put 操作。
设置 ContentType
只支持未添加过附件的 post、put 操作。
charset - 内容编码设置 ContentType
只支持未添加过附件的 post、put 操作。
contentType - 包含 mimeType 和 charset(可选) 的字符串,如 “application/x-www-form-urlencoded,charset=UTF-8”设置 ContentType
只支持未添加过附件的 post、put 操作。
contentType - 如 org.apache.http.entity.ContentType.APPLICATION_JSON设置一个 CookieStore
设置 Header,会覆盖所有之前的 Header
设置双向认证的JKS
jksFilePath - jks文件路径password - 密码设置双向认证的JKS
jksFile - jks文件password - 密码设置双向认证的JKS, 不会关闭InputStream
instream - jks流password - 密码设置双向认证的JKS
keyStore - jks设置请求参数,会清空并覆盖之前的参数、并设置 ContentType 为 application/octet-stream
只支持未添加过附件的 post、put 操作,并且不等于附件上传,而是将文件内容设置为请求体。
设置请求参数,会清空并覆盖之前的参数、并设置 ContentType 为 application/octet-stream
只支持未添加过附件的 post、put 操作。
设置请求参数,会清空并覆盖之前的参数、并设置 ContentType 为 application/octet-stream
只支持未添加过附件的 post、put 操作。
// * 设置参数为Json对象 // *
parameter - 参数对象
// *设置请求参数,会清空并覆盖之前的参数、并设置 ContentType 为 application/octet-stream
只支持未添加过附件的 post、put 操作。
尤其需要注意的是,写入 pipedOutputStream 的操作必须再另一个线程中执行、并确保该线程执行后调用 close 关闭 pipedOutputStream,否则会导致死锁,如:
PipedOutputStream os = new PipedOutputStream()
PipedInputStream is = new PipedInputStream(os)
httpClient.setParameter(is).setContentType(HttpClient.ContentType.APPLICATION_JSON)
Thread.start { StringUtils.toJson(irisRequest, os) }
其中 Trhead.start 部分可以作为闭包参数 inputThread 传进来,会自动启动一个线程。设置请求参数,会清空并覆盖之前的参数
只支持未添加过附件的 post、put 操作,以及 get、delete 操作。
设置 json 格式的请求参数、并设置 ContentType 为 "application/json,charset=UTF-8",会清空并覆盖之前的参数
只支持未添加过附件的 post、put 操作,以及 get、delete 操作。
设置 xml 格式的请求参数、并设置 ContentType 为 "application/xml,charset=UTF-8",会清空并覆盖之前的参数
只支持未添加过附件的 post、put 操作,以及 get、delete 操作。
// * 添加参数 // *
parameters
// - *设置网络代理
设置网络代理
设置网络代理
设置网络代理
设置是否启用调转
根据当前浏览器的 http 请求,会覆盖之前的 headers、cookies 和 request body(仅支持post/put),类似于代理。
设置从服务器获取返回数据的超时时间,单位:ms
设置超时时间(毫秒)
socketTimeout - 从服务器获取返回数据的超时时间connectTimeout - 和服务器建立连接的超时时间connectionRequestTimeout - 从连接池获取连接的超时时间设置请求 Url
设置请求 Url
关闭连接