java中几种http请求方式

这篇具有很好参考价值的文章主要介绍了java中几种http请求方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Java中,发送HTTP请求的方式主要有以下几种:

  1. 使用java.net.HttpURLConnection类:
    HttpURLConnection是Java中用于发送HTTP请求和接收HTTP响应的类。它是java.net包中的一部分,基于Java的网络编程API。
    HttpURLConnection的一些常用参数和方法如下:

     请求方法(Request Method):
     
     GET:获取资源。
     POST:提交数据。
     PUT:更新资源。
     DELETE:删除资源。
     HEAD:获取资源的头部信息。
     OPTIONS:获取服务器支持的请求方法。
     TRACE:回显服务器收到的请求,用于测试和诊断。
     请求头(Request Headers):
     
     setRequestProperty(String key, String value):设置请求头的键值对。
     请求体(Request Body):
     
     setDoOutput(true):允许向服务器发送请求体。
     getOutputStream():获取输出流,用于写入请求体数据。
     响应状态(Response Status):
     
     getResponseCode():获取响应状态码。
     getResponseMessage():获取响应状态消息。
     响应头(Response Headers):
     
     getHeaderField(String name):获取指定名称的响应头的值。
     getHeaderFields():获取所有响应头的键值对。
     响应体(Response Body):
     
     getInputStream():获取输入流,用于读取响应体数据。
     连接和关闭:
     
     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();

优点:这是Java标准库提供的方法,不需要额外的依赖。

缺点:使用起来比较繁琐,需要手动处理连接、读取响应等操作。

  1. 使用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());

优点:这是Java 11新引入的HTTP客户端,支持HTTP/2,API设计更现代,使用起来更简洁。

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

  1. 使用Apache HttpClient库:
    HttpClient的体系结构主要包括以下几个核心组件:

     HttpClient:代表整个HTTP客户端,负责发送HTTP请求和处理HTTP响应。
     HttpRequest:代表一个HTTP请求,包括请求方法、URL、请求头、请求体等信息。
     HttpResponse:代表一个HTTP响应,包括响应状态、响应头、响应体等信息。
     HttpEntity:代表HTTP请求或响应的实体,可以是文本、二进制数据、文件等。
     HttpClientBuilder:用于创建和配置HttpClient实例的构建器。
     RequestConfig:用于配置请求的参数,例如连接超时时间、读取超时时间、代理等。
     HttpClientContext:用于传递上下文信息,例如Cookie、认证信息等。
     HttpClient的参数可以通过HttpClientBuilder和RequestConfig进行配置。下面是一些常见的参数:
     
     连接参数:
     
     连接超时时间(Connect Timeout):设置建立连接的最大等待时间。
     读取超时时间(Socket Timeout):设置从服务器读取数据的最大等待时间。
     连接池大小(Connection Pool Size):设置连接池的最大连接数。
     路由最大连接数(Max Connections per Route):设置每个目标主机的最大连接数。
     重试参数:
     
     重试次数(Retry Count):设置请求失败时的最大重试次数。
     重试间隔(Retry Interval):设置重试之间的时间间隔。
     认证参数:
     
     代理认证(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) {
            // 创建 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); // 设置连接池的最大连接数为10
            connectionManager.setDefaultMaxPerRoute(2);// 每个路由的最大连接数

            HttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(3, true); // 设置最大重试次数为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);
	}
}

优点:功能强大,支持各种HTTP方法、自定义请求头、连接池等。

缺点:需要额外引入Apache HttpClient依赖,使用起来相对复杂。

  1. 使用OkHttp库:
    OkHttpClient是Square公司开发的一款基于OkHttp库的HTTP客户端,它提供了丰富的功能和灵活的配置选项。OkHttpClient的主要组成部分包括:

     Dispatcher:负责调度HTTP请求和响应的处理线程。它可以同时处理多个请求,并根据配置的最大请求数进行限制。
     ConnectionPool:负责管理HTTP连接的连接池。它可以重用已经建立的连接,避免了每次请求都需要重新建立连接的开销。
     Interceptor:负责对请求和响应进行拦截和处理。Interceptor可以在请求发送之前和响应返回之后对数据进行修改和处理。
     Authenticator:负责处理HTTP身份验证。它可以根据服务器返回的身份验证要求,自动进行身份验证操作。
     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) {
// 创建一个信任所有证书的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];
                        }
                    }
            };

            // 创建一个SSLContext,并使用上面的TrustManager初始化
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());

            // 使用上面创建的SSLContext创建一个SSLSocketFactory
            javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();


            // 创建 OkHttpClient 实例并进行配置
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
            builder.connectionPool(new ConnectionPool(10, 2, TimeUnit.MINUTES));//设置连接池的参数,包括最大连接数、连接的存活时间等。
            builder.connectTimeout(10, TimeUnit.SECONDS); //设置建立连接的超时时间
            builder.readTimeout(10, TimeUnit.SECONDS); //设置从服务器读取数据的超时时间
            builder.writeTimeout(10, TimeUnit.SECONDS); //设置向服务器写入数据的超时时间

            Dispatcher dispatcher = new Dispatcher();
            dispatcher.setMaxRequests(10);
            dispatcher.setMaxRequestsPerHost(5);
            builder.dispatcher(dispatcher); //设置同时能够处理的最大请求数


            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();
                    // 发送修改后的请求
                    Response response = chain.proceed(modifiedRequest);
                    // 对响应进行处理
                    return response;
                }
            };
            builder.addInterceptor(interceptor);//添加请求和响应的拦截器,可以对数据进行修改和处理
            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());
	}
}

优点:API设计现代,使用简洁,支持同步和异步请求,支持HTTP/2。

缺点:需要额外引入OkHttp依赖。

5.使用restTemplate
RestTemplate使用了HttpClient库作为底层的请求工具,HttpClient也提供了连接池的支持。HttpClient的连接池默认情况下是开启的,可以通过配置参数来调整连接池的大小和超时时间。

    @Bean("restTemplate")
    public RestTemplate getRestTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
        // 创建 RestTemplate 默认情况下,它会使用Apache HttpClient作为底层的HTTP客户端库

        // 创建 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);// 最大连接数
        connectionManager.setDefaultMaxPerRoute(2);// 每个路由的最大连接数
        httpClientBuilder.setConnectionManager(connectionManager);

        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClientBuilder.build());
        factory.setConnectTimeout(1*1000);//建立连接的超时时间
        factory.setReadTimeout(1*1000);//从服务器读取数据的超时时间

        //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 发送请求
        //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中发送HTTP请求的主要方式,各有优点和缺点,可以根据具体需求选择使用。文章来源地址https://www.toymoban.com/news/detail-754637.html

到了这里,关于java中几种http请求方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】汇总Java中发送HTTP请求的7种方式

    今天在项目中发现一个功能模块是额外调用的外部服务,其采用CloseableHttpClient调用外部url中的接口…… CloseableHttpClient HTTP发送请求处理流程:

    2024年02月11日
    浏览(33)
  • java业务代码发送http请求(Post方式:请求参数为JSON格式;Get方式)

    实际开发中,可能需要发送http请求到第三方服务获取数据,于是就有以下应用: 依赖: 假设我需要在我的业务代码中调用该地址: url:http://xx.xx:xxxx/user/count 请求方法:post 内容类型:application/json 请求参数:id, username 返回参数:code 响应结果 int类型                  

    2024年02月12日
    浏览(45)
  • Java实现HTTP请求的几种方式-CloseableHttpClient(三)

    CloseableHttpClient是在HttpClient的基础上修改更新而来的,这里还涉及到请求头token的设置(请求验证),利用fastjson转换请求或返回结果字符串为json格式,当然上面两种方式也是可以设置请求头token、json的,这里只在下面说明。 基于第一章的测试接口,建立以下程序 创建客户端

    2023年04月20日
    浏览(36)
  • Java实现HTTP请求的几种方式-HttpURLConnection(一)

    在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或第三方接口(短信、天气等)。 准备两个项目: 项目A: 服务提供者 项目B:服务消费者 在项目A中

    2024年02月16日
    浏览(34)
  • 使用OkHttp发送POST请求的几种方式

    本文将介绍 OkHttp 客户端的基本用法。 主要介绍 OkHttp 3.x 版本中发送Post请求的几种方式。 使用 FormBody.Builder 构造基本的 RequestBody , 包含两个参数:用户名、密码,发送 POST请求。 如果要对请求进行身份验证,可以使用 Credentials.basic 构建器向请求头中添加凭据。 下面代码给

    2024年02月13日
    浏览(33)
  • HTTP请求的几种方式

    HTTP(Hypertest Transfer Protocol)是用于传输像HTML这样的超文本文件的应用层协议。它被设计用于WEB浏览器端和WEB服务端的交互,但也有其它用途。HTTP遵循经典的client-server模型,客户端发起请求尝试建立连接,然后等待服务端的应答。HTTP是无状态协议,这意味着服务端在两次请求间

    2024年02月08日
    浏览(41)
  • C++中几种处理函数返回值的方式

    函数可以返回一个具体的值,例如整数、浮点数、结构体、类对象等。返回值被复制到函数调用点,在调用点可以直接使用或赋给其他变量。 函数可以返回一个引用,引用是对某个变量的别名。通过引用返回可以避免复制大型对象的开销,并允许修改原始对象。需要注意的是

    2024年02月10日
    浏览(31)
  • 构造http请求的几种方式(附源码)

    博主个人社区:开发与算法学习社区 博主个人主页:Killing Vibe的博客 欢迎大家加入,一起交流学习~~ form (表单) 是 HTML 中的一个常用标签. 可以用于给服务器发送 GET 或者 POST 请求. form 的重要参数: action: 构造的 HTTP 请求的 URL 是什么. method: 构造的 HTTP 请求的 方法 是 GET 还是

    2023年04月09日
    浏览(37)
  • http请求和响应格式说明,http的get和post请求方式说明,http的请求体body的几种数据格式

    一个HTTP请求报文由 请求行(request line)、请求头部(header)、空行和请求数据 4个部分组成, 请求报文的一般格式 1、第一行必须是一个请求行(request-line),用来说明请求类型,要访问的资源以及所使用的HTTP版本 2、紧接着是一个请求头(header),用来说明服务器要使用的附加信息

    2024年02月02日
    浏览(44)
  • 使用HTTP方式发送请求及json数据的接收和解析

    目录 需求 请求端 1,添加依赖 2,请求对象 3,请求工具类 4,请求测试(事先开启接收端的服务) 接收端 数据请求模拟 本项目需要通过向对端第三方项目发送一个http的post类型的请求,并且指定了一些请求字段,数据传输采用了json,对请求头没有其他特殊要求,所以这里写

    2024年01月17日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包