Java Web中涉及大量的请求调用,常用的方式一般就是RPC和Http两种方式,本篇主要利用Apache的httpClient对表单提交,抽象出一个httpProxy统一适配模板
一. pom依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.2.2</version>
</dependency>
二. Java实现
public <T>T httpProxy(String ip,int port,,String url,Map<String,T> requestBody,Map<String,T>headerMap)
org.apache.http.HttpHost proxy = new org.apache.http.HttpHost(ip, port);
url = proxy + url;
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse response = null;
if (method.equals(Const.GET_METHOD)) { //GET提交
HttpGet httpGet = new HttpGet(url);
// 处理请求头
for (Map.Entry<String, T> map : headerMap.entrySet()) {
httpGet.setHeader(map.getKey(), map.getValue());
}
response = httpClient.execute(httpGet);
} else if (method.equals(Const.POST_METHOD)) {//POST提交
HttpPost httpPost = new HttpPost(url);
/// 处理请求体
List<NameValuePair> params = new ArrayList<NameValuePair>();
for (Map.Entry<String, T> map : requestBody.entrySet()) {
params.add(new BasicNameValuePair(map.getKey(), map.getValue()));
}
httpPost.setEntity(new UrlEncodedFormEntity(params));
// 处理请求头
for (Map.Entry<String, T> map : headerMap.entrySet()) {
httpPost.setHeader(map.getKey(), map.getValue());
}
response = httpClient.execute(httpPost);
} else {
response = null;
}
HttpEntity entity = response.getEntity();
org.apache.http.Header[] headers = response.getAllHeaders();
List<org.apache.http.Header> headerList = new ArrayList<org.apache.http.Header>();
for (org.apache.http.Header header : headers) {
headerList.add(header);
}
int code = response.getStatusLine().getStatusCode();
InputStream in = entity.getContent();
String responseBody = IOUtils.toString(in, HTTP.UTF_8);
httpClient.getConnectionManager().shutdown();
return new T(code, headerList, responseBody...);
}
说明:
1. 用泛型代表返回类型可以自行封装
2. form表单提交默认只支持get跟post,其他方式在SpringMVC中需要另加配置http的methodfilter
3. 模板中省去了日志的输出
4. 各个类的源jar不能导错