发布时间:2025-12-09 12:01:20 浏览次数:1
执行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不是线程安全的,不要多个线程维护一个HttpClientContextHttpClientContext 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 您的支持是对博主最大的鼓励,感谢您的认真阅读。 本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
163238.html