大家好,又见面了,我是你们的朋友全栈君。
执行GET请求
CloseableHttpClient httpClient = HttpClients.custom()
.build();
CloseableHttpResponse response = httpClient.execute(new HttpGet("https://www.baidu.com"));
System.out.println(EntityUtils.toString(response.getEntity()));
执行POST请求
提交form表单参数
CloseableHttpClient httpClient = HttpClients.custom()
.build();
HttpPost httpPost = new HttpPost("https://www.explame.com");
List<NameValuePair> formParams = new ArrayList<NameValuePair>();
//表单参数
formParams.add(new BasicNameValuePair("name1", "value1"));
formParams.add(new BasicNameValuePair("name2", "value2"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, "utf-8");
httpPost.setEntity(entity);
CloseableHttpResponse response = httpClient.execute(httpPost);
System.out.println(EntityUtils.toString(response.getEntity()));
提交payload参数
CloseableHttpClient httpClient = HttpClients.custom()
.build();
HttpPost httpPost = new HttpPost("https://www.explame.com");
StringEntity entity = new StringEntity("{\"id\": \"1\"}");
httpPost.setEntity(entity);
CloseableHttpResponse response = httpClient.execute(httpPost);
System.out.println(EntityUtils.toString(response.getEntity()));
post上传文件
CloseableHttpClient httpClient = HttpClients.custom()
.build();
HttpPost httpPost = new HttpPost("https://www.example.com");
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
//要上传的文件
multipartEntityBuilder.addBinaryBody("file", new File("temp.txt"));
httpPost.setEntity(multipartEntityBuilder.build());
CloseableHttpResponse response = httpClient.execute(httpPost);
System.out.println(EntityUtils.toString(response.getEntity()));
post提交multipart/form-data类型参数
CloseableHttpClient httpClient = HttpClients.custom()
.build();
HttpPost httpPost = new HttpPost("https://www.example.com");
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
multipartEntityBuilder.addTextBody("username","wycm");
multipartEntityBuilder.addTextBody("passowrd","123");
//文件
multipartEntityBuilder.addBinaryBody("file", new File("temp.txt"));
httpPost.setEntity(multipartEntityBuilder.build());
CloseableHttpResponse response = httpClient.execute(httpPost);
System.out.println(EntityUtils.toString(response.getEntity()));
设置User-Agent
CloseableHttpClient httpClient = HttpClients.custom()
.setUserAgent("Mozilla/5.0")
.build();
CloseableHttpResponse response = httpClient.execute(new HttpGet("https://www.baidu.com"));
System.out.println(EntityUtils.toString(response.getEntity()));
设置重试处理器 当请求超时, 会自动重试,最多3次
HttpRequestRetryHandler retryHandler = (exception, executionCount, context) -> {
if (executionCount >= 3) {
return false;
}
if (exception instanceof InterruptedIOException) {
return true;
}
if (exception instanceof UnknownHostException) {
return true;
}
if (exception instanceof ConnectTimeoutException) {
return true;
}
if (exception instanceof SSLException) {
return true;
}
HttpClientContext clientContext = HttpClientContext.adapt(context);
HttpRequest request = clientContext.getRequest();
boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
if (idempotent) {
return true;
}
return false;
};
CloseableHttpClient httpClient = HttpClients.custom()
.setRetryHandler(retryHandler)
.build();
httpClient.execute(new HttpGet("https://www.baidu.com"));
重定向策略
HttpClient默认情况 会对302、307的GET和HEAD请求以及所有的303状态码做重定向处理
关闭自动重定向
CloseableHttpClient httpClient = HttpClients.custom()
//关闭httpclient重定向
.disableRedirectHandling()
.build();
POST支持302状态码重定向
CloseableHttpClient httpClient = HttpClients.custom()
//post 302支持重定向
.setRedirectStrategy(new LaxRedirectStrategy())
.build();
CloseableHttpResponse response = httpClient.execute(new HttpPost("https://www.explame.com"));
System.out.println(EntityUtils.toString(response.getEntity()));
定制cookie
方式一:通过addHeader方式设置(不推荐这种方式)
CloseableHttpClient httpClient = HttpClients.custom()
.build();
HttpGet httpGet = new HttpGet("http://www.example.com");
httpGet.addHeader("Cookie", "name=value");
httpClient.execute(httpGet);
由于HttpClient默认会维护cookie状态。如果这个请求response中有Set-Cookie头,那下次请求的时候httpclient默认会把这个Cookie带上。并且会新建一行header。如果再遇到
httpGet.addHeader("Cookie", "name=value");
那么下次请求则会有两行name为Cookie的header。
方式二:通过CookieStore的方式,以浏览器中的cookie为例(推荐)
//此处直接粘贴浏览器cookiefinal String RAW_COOKIES = "name1=value1; name2=value2";final CookieStore cookieStore = new BasicCookieStore();for (String rawCookie : RAW_COOKIES.split("; ")){ String[] s = rawCookie.split("="); BasicClientCookie cookie = new BasicClientCookie(s[0], s[1]); cookie.setDomain("baidu.com"); cookie.setPath("/"); cookie.setSecure(false); cookie.setAttribute("domain", "baidu.com"); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, +5); cookie.setExpiryDate(calendar.getTime()); cookieStore.addCookie(cookie);}CloseableHttpClient httpClient = HttpClients.custom() .setDefaultCookieStore(cookieStore) .build();httpClient.execute(new HttpGet("https://www.baidu.com"));
这种方式把定制的cookie交给httpclient维护。
cookie管理
方式一:初始化HttpClient时,传入一个自己CookieStore对象
CookieStore cookieStore = new BasicCookieStore();
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultCookieStore(cookieStore)
.build();
httpClient.execute(new HttpGet("https://www.baidu.com"));
//请求一次后,清理cookie再发起一次新的请求
cookieStore.clear();
httpClient.execute(new HttpGet("https://www.baidu.com"));
方式二:每次执行请求的时候传入自己的HttpContext对象
//注:HttpClientContext不是线程安全的,不要多个线程维护一个HttpClientContext
HttpClientContext httpContext = HttpClientContext.create();
CloseableHttpClient httpClient = HttpClients.custom()
.build();
httpClient.execute(new HttpGet("https://www.baidu.com"), httpContext);
//请求一次后,清理cookie再发起一次新的请求
httpContext.getCookieStore().clear();
httpClient.execute(new HttpGet("https://www.baidu.com"));
http代理的配置
CloseableHttpClient httpClient = HttpClients.custom()
//设置代理
.setRoutePlanner(new DefaultProxyRoutePlanner(new HttpHost("localhost", 8888)))
.build();
CloseableHttpResponse response = httpClient.execute(new HttpGet("http://www.example.com"));
System.out.println(EntityUtils.toString(response.getEntity()));
SSL配置
//默认信任
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(KeyStore.getInstance(KeyStore.getDefaultType())
, (chain, authType) -> true).build();
Registry<ConnectionSocketFactory> socketFactoryRegistry =
RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", new SocketProxyPlainConnectionSocketFactory())
.register("https", new SocketProxySSLConnectionSocketFactory(sslContext))
.build();
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(new PoolingHttpClientConnectionManager(socketFactoryRegistry))
.build();
HttpClientContext httpClientContext = HttpClientContext.create();
httpClientContext.setAttribute("socks.address", new InetSocketAddress("127.0.0.1", 1086));
CloseableHttpResponse response = httpClient.execute(new HttpGet("https://httpbin.org/ip"), httpClientContext);
System.out.println(EntityUtils.toString(response.getEntity()));
socket代理配置
static class SocketProxyPlainConnectionSocketFactory extends PlainConnectionSocketFactory{
@Override
public Socket createSocket(final HttpContext context) {
InetSocketAddress socksAddr = (InetSocketAddress) context.getAttribute("socks.address");
if (socksAddr != null){
Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksAddr);
return new Socket(proxy);
} else {
return new Socket();
}
}
}
static class SocketProxySSLConnectionSocketFactory extends SSLConnectionSocketFactory {
public SocketProxySSLConnectionSocketFactory(final SSLContext sslContext) {
super(sslContext, NoopHostnameVerifier.INSTANCE);
}
@Override
public Socket createSocket(final HttpContext context) {
InetSocketAddress socksAddr = (InetSocketAddress) context.getAttribute("socks.address");
if (socksAddr != null){
Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksAddr);
return new Socket(proxy);
} else {
return new Socket();
}
}
}
/**
* socket代理配置
*/
public static void socketProxy() throws Exception {
//默认信任
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(KeyStore.getInstance(KeyStore.getDefaultType())
, (X509Certificate[] chain, String authType) -> true).build();
Registry<ConnectionSocketFactory> socketFactoryRegistry =
RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", new SocketProxyPlainConnectionSocketFactory())
.register("https", new SocketProxySSLConnectionSocketFactory(sslContext))
.build();
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(new PoolingHttpClientConnectionManager(socketFactoryRegistry))
.build();
HttpClientContext httpClientContext = HttpClientContext.create();
httpClientContext.setAttribute("socks.address", new InetSocketAddress("127.0.0.1", 1086));
CloseableHttpResponse response = httpClient.execute(new HttpGet("https://httpbin.org/ip"), httpClientContext);
System.out.println(EntityUtils.toString(response.getEntity()));
}
下载文件
CloseableHttpClient httpClient = HttpClients.custom().build();
CloseableHttpResponse response = httpClient.execute(new HttpGet("https://www.example.com"));
InputStream is = response.getEntity().getContent();
Files.copy(is, new File("temp.png").toPath(), StandardCopyOption.REPLACE_EXISTING);
版权声明 作者:wycm 出处:https://blog.csdn.net/vwycm/article/details/88638996 您的支持是对博主最大的鼓励,感谢您的认真阅读。 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163238.html原文链接:https://javaforall.cn