本章使用HttpClient4.5.5完成访问定点网站的简单的功能。
pom文件:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.5</version>
</dependency>
定义Request和Response:
import lombok.Data;
import java.util.*;
@Data
public class Request {
private String id;
private String url;
private Method method;
private Map<String, String> headers;
private Map<String, String> params = new HashMap<>();
public Request(String id, String url, Method method){
this.id = id;
this.url = url;
this.method = method;
this.headers = new HashMap<>();
}
public void addHeader(String key, String value){
headers.put(key, value);
}
}
import lombok.Data;
import org.apache.http.Header;
import java.util.ArrayList;
import java.util.List;
@Data
public class Response {
private int statusCode;
private String content;
private Request request;
private List<Header> headers = new ArrayList<>();
}
public enum Method {
get,
post;
Method() {}
}
接口定义:
import com.demo.net.model.Request;
import com.demo.net.model.Response;
import java.io.IOException;
public interface HttpClient {
Response execute(Request request) throws IOException;
}
具体实现类:
import com.demo.net.HttpClient;
import com.demo.net.model.Request;
import com.demo.net.model.Response;
import org.apache.commons.collections.MapUtils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpMessage;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.CharArrayBuffer;
import org.apache.http.util.EntityUtils;
import org.springframework.util.Assert;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
public class ConcreteHttpClient implements HttpClient {
@Override
public Response execute(Request request) throws IOException {
Assert.notNull(request, "invalid request");
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse closeableHttpResponse = null;
Response response = new Response();
try {
switch (request.getMethod()){
case get:
closeableHttpResponse = httpClient.execute(assembleHttpGet(request));
break;
case post:
closeableHttpResponse = httpClient.execute(assembleHttpPost(request));
break;
default:
throw new RuntimeException("未知请求");
}
if(closeableHttpResponse != null){
response.setRequest(request);
response.setStatusCode(closeableHttpResponse.getStatusLine().getStatusCode());
response.setContent(entityToString(closeableHttpResponse.getEntity()));
for (Header header : closeableHttpResponse.getAllHeaders()){
response.getHeaders().add(header);
}
}
}catch (Exception e){
throw e;
}finally {
if (closeableHttpResponse != null){
closeableHttpResponse.close();
}
httpClient.close();
}
return response;
}
/**
* get请求包装
* @param request
* @return
*/
private HttpGet assembleHttpGet(Request request){
HttpGet httpGet = new HttpGet(request.getUrl());
setHeaders(httpGet, request.getHeaders());
return httpGet;
}
/**
* post请求包装
* @param request
* @return
*/
private HttpPost assembleHttpPost(Request request){
HttpPost httpPost = new HttpPost(request.getUrl());
setHeaders(httpPost, request.getHeaders());
return httpPost;
}
/**
* 设置headers
* @param httpMessage
* @param headers
*/
private void setHeaders(HttpMessage httpMessage, Map<String, String> headers){
if (MapUtils.isNotEmpty(headers)){
for (Map.Entry<String, String> entry : headers.entrySet()){
httpMessage.setHeader(entry.getKey(), entry.getValue());
}
}
}
private String entityToString(HttpEntity entity) throws IOException {
String result = null;
if(entity != null){
long lenth = entity.getContentLength();
if(lenth != -1 && lenth < 2048){
result = EntityUtils.toString(entity,"UTF-8");
}else {
InputStreamReader reader1 = new InputStreamReader(entity.getContent(), "UTF-8");
CharArrayBuffer buffer = new CharArrayBuffer(2048);
char[] tmp = new char[1024];
int l;
while((l = reader1.read(tmp)) != -1) {
buffer.append(tmp, 0, l);
}
result = buffer.toString();
}
}
return result;
}
}
打开目标网站,查看发起请求的request信息,复制。
测试:
public static void main(String[] args) throws IOException {
HttpClient httpClient = new ConcreteHttpClient();
Request request = new Request("test", "https://www.baidu.com", Method.get);
request.addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
request.addHeader("Accept-Language", "zh-CN");
request.addHeader("Accept-Encoding", "gzip, deflate");
request.addHeader("Host", "www.baidu.com");
request.addHeader("Connection", "Keep-Alive");
request.addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36");
Response response = httpClient.execute(request);
System.out.println(response.getContent());
}