java中幾種http請求方式示例詳解
在Java中,發(fā)送HTTP請求的方式主要有以下幾種:
1.使用java.net.HttpURLConnection類:
HttpURLConnection是Java中用于發(fā)送HTTP請求和接收HTTP響應(yīng)的類。它是java.net包中的一部分,基于Java的網(wǎng)絡(luò)編程API。
HttpURLConnection的一些常用參數(shù)和方法如下:
請求方法(Request Method):
GET:獲取資源。
POST:提交數(shù)據(jù)。
PUT:更新資源。
DELETE:刪除資源。
HEAD:獲取資源的頭部信息。
OPTIONS:獲取服務(wù)器支持的請求方法。
TRACE:回顯服務(wù)器收到的請求,用于測試和診斷。
請求頭(Request Headers):
setRequestProperty(String key, String value):設(shè)置請求頭的鍵值對。
請求體(Request Body):
setDoOutput(true):允許向服務(wù)器發(fā)送請求體。
getOutputStream():獲取輸出流,用于寫入請求體數(shù)據(jù)。
響應(yīng)狀態(tài)(Response Status):
getResponseCode():獲取響應(yīng)狀態(tài)碼。
getResponseMessage():獲取響應(yīng)狀態(tài)消息。
響應(yīng)頭(Response Headers):
getHeaderField(String name):獲取指定名稱的響應(yīng)頭的值。
getHeaderFields():獲取所有響應(yīng)頭的鍵值對。
響應(yīng)體(Response Body):
getInputStream():獲取輸入流,用于讀取響應(yīng)體數(shù)據(jù)。
連接和關(guān)閉:
connect():建立與服務(wù)器的連接。
disconnect():關(guān)閉連接。
URL url = new URL("http://example.com"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); // 設(shè)置連接超時時間為5秒 conn.setReadTimeout(5000); // 設(shè)置讀取超時時間為5秒 BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); System.out.println("Response Body: " + response.toString()); connection.disconnect();
優(yōu)點(diǎn):這是Java標(biāo)準(zhǔn)庫提供的方法,不需要額外的依賴。
缺點(diǎn):使用起來比較繁瑣,需要手動處理連接、讀取響應(yīng)等操作。
2.使用java.net.http.HttpClient類(Java 11及以上版本):
HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("http://example.com")) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
優(yōu)點(diǎn):這是Java 11新引入的HTTP客戶端,支持HTTP/2,API設(shè)計更現(xiàn)代,使用起來更簡潔。
缺點(diǎn):只有Java 11及以上版本才提供。
3.使用Apache HttpClient庫:
HttpClient的體系結(jié)構(gòu)主要包括以下幾個核心組件:
HttpClient:代表整個HTTP客戶端,負(fù)責(zé)發(fā)送HTTP請求和處理HTTP響應(yīng)。
HttpRequest:代表一個HTTP請求,包括請求方法、URL、請求頭、請求體等信息。
HttpResponse:代表一個HTTP響應(yīng),包括響應(yīng)狀態(tài)、響應(yīng)頭、響應(yīng)體等信息。
HttpEntity:代表HTTP請求或響應(yīng)的實(shí)體,可以是文本、二進(jìn)制數(shù)據(jù)、文件等。
HttpClientBuilder:用于創(chuàng)建和配置HttpClient實(shí)例的構(gòu)建器。
RequestConfig:用于配置請求的參數(shù),例如連接超時時間、讀取超時時間、代理等。
HttpClientContext:用于傳遞上下文信息,例如Cookie、認(rèn)證信息等。
HttpClient的參數(shù)可以通過HttpClientBuilder和RequestConfig進(jìn)行配置。下面是一些常見的參數(shù):
連接參數(shù):
連接超時時間(Connect Timeout):設(shè)置建立連接的最大等待時間。
讀取超時時間(Socket Timeout):設(shè)置從服務(wù)器讀取數(shù)據(jù)的最大等待時間。
連接池大?。–onnection Pool Size):設(shè)置連接池的最大連接數(shù)。
路由最大連接數(shù)(Max Connections per Route):設(shè)置每個目標(biāo)主機(jī)的最大連接數(shù)。
重試參數(shù):
重試次數(shù)(Retry Count):設(shè)置請求失敗時的最大重試次數(shù)。
重試間隔(Retry Interval):設(shè)置重試之間的時間間隔。
認(rèn)證參數(shù):
代理認(rèn)證(Proxy Authentication):設(shè)置代理服務(wù)器的認(rèn)證信息。
目標(biāo)主機(jī)認(rèn)證(Target Host Authentication):設(shè)置目標(biāo)主機(jī)的認(rèn)證信息。
Cookie管理:
Cookie存儲(Cookie Store):用于保存和管理Cookie。
Cookie策略(Cookie Policy):設(shè)置處理Cookie的策略,例如接受所有Cookie、只接受來自同一域的Cookie等。
引入jar
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.6</version> </dependency>
import org.apache.http.client.CookieStore; import org.apache.http.client.HttpRequestRetryHandler; import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; public class HttpClientSingleton { private static CloseableHttpClient httpClient; private HttpClientSingleton() {} public static synchronized CloseableHttpClient getInstance() { if (httpClient == null) { // 創(chuàng)建 HttpClient 實(shí)例并進(jìn)行配置 HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(5000)// 設(shè)置連接超時時間為5秒 .setSocketTimeout(5000)// 設(shè)置讀取超時時間為5秒 .build(); SSLConnectionSocketFactory sslConnectionSocketFactory = null; try { sslConnectionSocketFactory = new SSLConnectionSocketFactory(MyBeanConfig.getSslcontext(), SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() .register("https", sslConnectionSocketFactory) .register("http", new PlainConnectionSocketFactory()) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); connectionManager.setMaxTotal(10); // 設(shè)置連接池的最大連接數(shù)為10 connectionManager.setDefaultMaxPerRoute(2);// 每個路由的最大連接數(shù) HttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(3, true); // 設(shè)置最大重試次數(shù)為3次 CookieStore cookieStore = new BasicCookieStore();//設(shè)置cookie httpClientBuilder.setDefaultRequestConfig(requestConfig); httpClientBuilder.setConnectionManager(connectionManager); httpClientBuilder.setRetryHandler(retryHandler); httpClientBuilder.setDefaultCookieStore(cookieStore); httpClient = httpClientBuilder.build(); } return httpClient; } public static void main(String[] arg) { CloseableHttpClient client = getInstance(); HttpGet request = new HttpGet("http://example.com"); CloseableHttpResponse response = client.execute(request); String resultString = EntityUtils.toString(execute.getEntity(), "utf-8"); System.out.print(resultString); } }
優(yōu)點(diǎn):功能強(qiáng)大,支持各種HTTP方法、自定義請求頭、連接池等。
缺點(diǎn):需要額外引入Apache HttpClient依賴,使用起來相對復(fù)雜。
4.使用OkHttp庫:
OkHttpClient是Square公司開發(fā)的一款基于OkHttp庫的HTTP客戶端,它提供了豐富的功能和靈活的配置選項(xiàng)。OkHttpClient的主要組成部分包括:
Dispatcher:負(fù)責(zé)調(diào)度HTTP請求和響應(yīng)的處理線程。它可以同時處理多個請求,并根據(jù)配置的最大請求數(shù)進(jìn)行限制。
ConnectionPool:負(fù)責(zé)管理HTTP連接的連接池。它可以重用已經(jīng)建立的連接,避免了每次請求都需要重新建立連接的開銷。
Interceptor:負(fù)責(zé)對請求和響應(yīng)進(jìn)行攔截和處理。Interceptor可以在請求發(fā)送之前和響應(yīng)返回之后對數(shù)據(jù)進(jìn)行修改和處理。
Authenticator:負(fù)責(zé)處理HTTP身份驗(yàn)證。它可以根據(jù)服務(wù)器返回的身份驗(yàn)證要求,自動進(jìn)行身份驗(yàn)證操作。
DNS:負(fù)責(zé)解析主機(jī)名。它可以將主機(jī)名解析為對應(yīng)的IP地址,以便建立HTTP連接。
引入jar
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.14.9</version> </dependency>
import okhttp3.*; import java.io.IOException; import java.util.concurrent.TimeUnit; public class OkHttpClientSingleton { private static OkHttpClient okHttpClient; private OkHttpClientSingleton() {} public static synchronized OkHttpClient getInstance() throws NoSuchAlgorithmException, KeyManagementException { if (okHttpClient == null) { // 創(chuàng)建一個信任所有證書的TrustManager final TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } }; // 創(chuàng)建一個SSLContext,并使用上面的TrustManager初始化 SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); // 使用上面創(chuàng)建的SSLContext創(chuàng)建一個SSLSocketFactory javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); // 創(chuàng)建 OkHttpClient 實(shí)例并進(jìn)行配置 OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]); builder.connectionPool(new ConnectionPool(10, 2, TimeUnit.MINUTES));//設(shè)置連接池的參數(shù),包括最大連接數(shù)、連接的存活時間等。 builder.connectTimeout(10, TimeUnit.SECONDS); //設(shè)置建立連接的超時時間 builder.readTimeout(10, TimeUnit.SECONDS); //設(shè)置從服務(wù)器讀取數(shù)據(jù)的超時時間 builder.writeTimeout(10, TimeUnit.SECONDS); //設(shè)置向服務(wù)器寫入數(shù)據(jù)的超時時間 Dispatcher dispatcher = new Dispatcher(); dispatcher.setMaxRequests(10); dispatcher.setMaxRequestsPerHost(5); builder.dispatcher(dispatcher); //設(shè)置同時能夠處理的最大請求數(shù) Interceptor interceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); // 對請求進(jìn)行修改 Request modifiedRequest = request.newBuilder() .header("Authorization", "Bearer token") .build(); // 發(fā)送修改后的請求 Response response = chain.proceed(modifiedRequest); // 對響應(yīng)進(jìn)行處理 return response; } }; builder.addInterceptor(interceptor);//添加請求和響應(yīng)的攔截器,可以對數(shù)據(jù)進(jìn)行修改和處理 okHttpClient = builder.build(); } return okHttpClient; } public static void main(String[] arg) { OkHttpClient client = getInstance(); Request request = new Request.Builder() .url("http://example.com") .addHeader("User-Agent", "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36") .build(); Response response = client.newCall(request).execute(); System.out.print(execute.message()); System.out.print(execute.body().bytes()); } }
優(yōu)點(diǎn):API設(shè)計現(xiàn)代,使用簡潔,支持同步和異步請求,支持HTTP/2。
缺點(diǎn):需要額外引入OkHttp依賴。
5.使用restTemplate
RestTemplate使用了HttpClient庫作為底層的請求工具,HttpClient也提供了連接池的支持。HttpClient的連接池默認(rèn)情況下是開啟的,可以通過配置參數(shù)來調(diào)整連接池的大小和超時時間。
@Bean("restTemplate") public RestTemplate getRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { // 創(chuàng)建 RestTemplate 默認(rèn)情況下,它會使用Apache HttpClient作為底層的HTTP客戶端庫 // 創(chuàng)建 HttpClientBuilder 對象 HttpClientBuilder httpClientBuilder = HttpClients.custom(); SSLConnectionSocketFactory sslConnectionSocketFactory = null; try { sslConnectionSocketFactory = new SSLConnectionSocketFactory(getSslcontext(), SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() .register("https", sslConnectionSocketFactory) .register("http", new PlainConnectionSocketFactory()) .build(); PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); connectionManager.setMaxTotal(10);// 最大連接數(shù) connectionManager.setDefaultMaxPerRoute(2);// 每個路由的最大連接數(shù) httpClientBuilder.setConnectionManager(connectionManager); HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClientBuilder.build()); factory.setConnectTimeout(1*1000);//建立連接的超時時間 factory.setReadTimeout(1*1000);//從服務(wù)器讀取數(shù)據(jù)的超時時間 //ignoreSSL(); RestTemplate restTemplate = new RestTemplate(factory); restTemplate.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(new MappingJackson2HttpMessageConverter(), new StringHttpMessageConverter()));// 消息轉(zhuǎn)換器(setMessageConverters):設(shè)置請求和響應(yīng)的消息轉(zhuǎn)換器 restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); // 錯誤處理器(setErrorHandler):設(shè)置請求過程中的錯誤處理器 return restTemplate; } @Qualifier("restTemplate") @Autowired private RestTemplate restTemplate; @Test public void t1() throws KeyManagementException, NoSuchAlgorithmException { // 使用 RestTemplate 發(fā)送請求 //MyBeanConfig.ignoreSSL(); ResponseEntity<String> response = restTemplate.getForEntity("http://example.com", String.class); System.out.print(response.getStatusCode()); System.out.print(response.getBody()); }
6.使用httpclient
引入jar
<dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency>
public class HttpTest2 { public static void main(String[] args) { HttpClient httpClient = new HttpClient(); PostMethod postMethod = new PostMethod("http://example.com"); postMethod.addRequestHeader("accept", "*/*"); postMethod.addRequestHeader("Content-Type", "application/json"); Map paraMap = new HashMap(); paraMap.put("id", "1"); postMethod.addParameter("serviceName", "queryMerchantService"); postMethod.addParameter("params", JSON.toJSONString(paraMap)); String result = ""; try { int code = httpClient.executeMethod(postMethod); if (code == 200){ result = postMethod.getResponseBodyAsString(); System.out.println("result:" + result); } } catch (IOException e) { e.printStackTrace(); } } }
以上就是Java中發(fā)送HTTP請求的主要方式,各有優(yōu)點(diǎn)和缺點(diǎn),可以根據(jù)具體需求選擇使用。
總結(jié)
到此這篇關(guān)于java中幾種http請求方式的文章就介紹到這了,更多相關(guān)java http請求方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
永久解決 Intellij idea 報錯:Error :java 不支持發(fā)行版本5的問題
這篇文章主要介紹了永久解決 Intellij idea 報錯:Error :java 不支持發(fā)行版本5的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02SpringBoot+MyBatis實(shí)現(xiàn)登錄案例
前端時間在網(wǎng)上看到有朋友在學(xué)習(xí)springboot項(xiàng)目的搭建過程,今天就抽空給大家分享一個案例幫助大家學(xué)習(xí)SpringBoot+MyBatis實(shí)現(xiàn)登錄功能,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧2021-06-06Spring Security實(shí)現(xiàn)多次登錄失敗后賬戶鎖定功能
當(dāng)用戶多次登錄失敗的時候,我們應(yīng)該將賬戶鎖定,等待一定的時間之后才能再次進(jìn)行登錄操作。今天小編給大家分享Spring Security實(shí)現(xiàn)多次登錄失敗后賬戶鎖定功能,感興趣的朋友一起看看吧2019-11-11