最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中幾種http請求方式示例詳解

 更新時間:2023年11月16日 09:20:04   作者:m0_38051458  
在日常工作和學習中有很多地方都需要發(fā)送HTTP請求,下面這篇文章主要給大家介紹了關于java中幾種http請求方式的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

在Java中,發(fā)送HTTP請求的方式主要有以下幾種:

1.使用java.net.HttpURLConnection類:

HttpURLConnection是Java中用于發(fā)送HTTP請求和接收HTTP響應的類。它是java.net包中的一部分,基于Java的網(wǎng)絡編程API。
HttpURLConnection的一些常用參數(shù)和方法如下:

 請求方法(Request Method):
 
 GET:獲取資源。
 POST:提交數(shù)據(jù)。
 PUT:更新資源。
 DELETE:刪除資源。
 HEAD:獲取資源的頭部信息。
 OPTIONS:獲取服務器支持的請求方法。
 TRACE:回顯服務器收到的請求,用于測試和診斷。
 請求頭(Request Headers):
 
 setRequestProperty(String key, String value):設置請求頭的鍵值對。
 請求體(Request Body):
 
 setDoOutput(true):允許向服務器發(fā)送請求體。
 getOutputStream():獲取輸出流,用于寫入請求體數(shù)據(jù)。
 響應狀態(tài)(Response Status):
 
 getResponseCode():獲取響應狀態(tài)碼。
 getResponseMessage():獲取響應狀態(tài)消息。
 響應頭(Response Headers):
 
 getHeaderField(String name):獲取指定名稱的響應頭的值。
 getHeaderFields():獲取所有響應頭的鍵值對。
 響應體(Response Body):
 
 getInputStream():獲取輸入流,用于讀取響應體數(shù)據(jù)。
 連接和關閉:
 
 connect():建立與服務器的連接。
 disconnect():關閉連接。

URL url = new URL("http://example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000); // 設置連接超時時間為5秒
conn.setReadTimeout(5000); // 設置讀取超時時間為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)點:這是Java標準庫提供的方法,不需要額外的依賴。

缺點:使用起來比較繁瑣,需要手動處理連接、讀取響應等操作。

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)點:這是Java 11新引入的HTTP客戶端,支持HTTP/2,API設計更現(xiàn)代,使用起來更簡潔。

缺點:只有Java 11及以上版本才提供。

3.使用Apache HttpClient庫:

HttpClient的體系結構主要包括以下幾個核心組件:

 HttpClient:代表整個HTTP客戶端,負責發(fā)送HTTP請求和處理HTTP響應。
 HttpRequest:代表一個HTTP請求,包括請求方法、URL、請求頭、請求體等信息。
 HttpResponse:代表一個HTTP響應,包括響應狀態(tài)、響應頭、響應體等信息。
 HttpEntity:代表HTTP請求或響應的實體,可以是文本、二進制數(shù)據(jù)、文件等。
 HttpClientBuilder:用于創(chuàng)建和配置HttpClient實例的構建器。
 RequestConfig:用于配置請求的參數(shù),例如連接超時時間、讀取超時時間、代理等。
 HttpClientContext:用于傳遞上下文信息,例如Cookie、認證信息等。
 HttpClient的參數(shù)可以通過HttpClientBuilder和RequestConfig進行配置。下面是一些常見的參數(shù):
 
 連接參數(shù):
 
 連接超時時間(Connect Timeout):設置建立連接的最大等待時間。
 讀取超時時間(Socket Timeout):設置從服務器讀取數(shù)據(jù)的最大等待時間。
 連接池大?。–onnection Pool Size):設置連接池的最大連接數(shù)。
 路由最大連接數(shù)(Max Connections per Route):設置每個目標主機的最大連接數(shù)。
 重試參數(shù):
 
 重試次數(shù)(Retry Count):設置請求失敗時的最大重試次數(shù)。
 重試間隔(Retry Interval):設置重試之間的時間間隔。
 認證參數(shù):
 
 代理認證(Proxy Authentication):設置代理服務器的認證信息。
 目標主機認證(Target Host Authentication):設置目標主機的認證信息。
 Cookie管理:
 
 Cookie存儲(Cookie Store):用于保存和管理Cookie。
 Cookie策略(Cookie Policy):設置處理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 實例并進行配置
            HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
            RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(5000)// 設置連接超時時間為5秒
                .setSocketTimeout(5000)// 設置讀取超時時間為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ù)為10
            connectionManager.setDefaultMaxPerRoute(2);// 每個路由的最大連接數(shù)

            HttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(3, true); // 設置最大重試次數(shù)為3次

            CookieStore cookieStore = new BasicCookieStore();//設置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)點:功能強大,支持各種HTTP方法、自定義請求頭、連接池等。

缺點:需要額外引入Apache HttpClient依賴,使用起來相對復雜。

4.使用OkHttp庫:

OkHttpClient是Square公司開發(fā)的一款基于OkHttp庫的HTTP客戶端,它提供了豐富的功能和靈活的配置選項。OkHttpClient的主要組成部分包括:

 Dispatcher:負責調度HTTP請求和響應的處理線程。它可以同時處理多個請求,并根據(jù)配置的最大請求數(shù)進行限制。
 ConnectionPool:負責管理HTTP連接的連接池。它可以重用已經(jīng)建立的連接,避免了每次請求都需要重新建立連接的開銷。
 Interceptor:負責對請求和響應進行攔截和處理。Interceptor可以在請求發(fā)送之前和響應返回之后對數(shù)據(jù)進行修改和處理。
 Authenticator:負責處理HTTP身份驗證。它可以根據(jù)服務器返回的身份驗證要求,自動進行身份驗證操作。
 DNS:負責解析主機名。它可以將主機名解析為對應的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 實例并進行配置
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            builder.connectionPool(new ConnectionPool(10, 2, TimeUnit.MINUTES));//設置連接池的參數(shù),包括最大連接數(shù)、連接的存活時間等。
            builder.connectTimeout(10, TimeUnit.SECONDS); //設置建立連接的超時時間
            builder.readTimeout(10, TimeUnit.SECONDS); //設置從服務器讀取數(shù)據(jù)的超時時間
            builder.writeTimeout(10, TimeUnit.SECONDS); //設置向服務器寫入數(shù)據(jù)的超時時間

            Dispatcher dispatcher = new Dispatcher();
            dispatcher.setMaxRequests(10);
            dispatcher.setMaxRequestsPerHost(5);
            builder.dispatcher(dispatcher); //設置同時能夠處理的最大請求數(shù)


            Interceptor interceptor = new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    // 對請求進行修改
                    Request modifiedRequest = request.newBuilder()
                            .header("Authorization", "Bearer token")
                            .build();
                    // 發(fā)送修改后的請求
                    Response response = chain.proceed(modifiedRequest);
                    // 對響應進行處理
                    return response;
                }
            };
            builder.addInterceptor(interceptor);//添加請求和響應的攔截器,可以對數(shù)據(jù)進行修改和處理
            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)點:API設計現(xiàn)代,使用簡潔,支持同步和異步請求,支持HTTP/2。

缺點:需要額外引入OkHttp依賴。

5.使用restTemplate

RestTemplate使用了HttpClient庫作為底層的請求工具,HttpClient也提供了連接池的支持。HttpClient的連接池默認情況下是開啟的,可以通過配置參數(shù)來調整連接池的大小和超時時間。

    @Bean("restTemplate")
    public RestTemplate getRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
        // 創(chuàng)建 RestTemplate 默認情況下,它會使用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);//從服務器讀取數(shù)據(jù)的超時時間
        //ignoreSSL();
        RestTemplate restTemplate = new RestTemplate(factory);
        restTemplate.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(new MappingJackson2HttpMessageConverter(), new StringHttpMessageConverter()));// 消息轉換器(setMessageConverters):設置請求和響應的消息轉換器
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); // 錯誤處理器(setErrorHandler):設置請求過程中的錯誤處理器
        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)點和缺點,可以根據(jù)具體需求選擇使用。

總結

到此這篇關于java中幾種http請求方式的文章就介紹到這了,更多相關java http請求方式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

台东县| 姜堰市| 正安县| 屏边| 鄯善县| 深圳市| 九台市| 嵊泗县| 旅游| 鹤庆县| 邢台市| 长丰县| 新邵县| 金塔县| 平谷区| 泰顺县| 巴塘县| 宽甸| 全南县| 淅川县| 宾阳县| 宁南县| 甘孜县| 三台县| 大关县| 清远市| 团风县| 政和县| 鸡东县| 金门县| 读书| 镇原县| 龙游县| 平顶山市| 义马市| 清徐县| 龙陵县| 沿河| 吴川市| 靖宇县| 凌云县|