当前位置: 代码网 > it编程>编程语言>Java > SpringBoot实战(二十九)发送HTTP/HTTPS请求(HttpURLConnection、HttpClient、Okhttp3、RestTemplate)

SpringBoot实战(二十九)发送HTTP/HTTPS请求(HttpURLConnection、HttpClient、Okhttp3、RestTemplate)

2024年08月03日 Java 我要评论
SpringBoot实战(二十九)发送HTTP/HTTPS请求(HttpURLConnection、HttpClient、Okhttp3、RestTemplate)

实现方式一、java.net.httpurlconnection 实现

1.1 简介

  • java.net.httpurlconnection 是 java 标准库中用来发送 http 请求和接收 http 响应的类。不需要额外引入任何依赖,即可实现

httpurlconnection 预先定义了一些方法,方便开发者自由地控制请求和响应。如:

  • setrequestmethod():设置 get、post 等请求方式;
  • setrequestproperty():设置请求参数。
  • getresponsecode():获取请求状态码。
  • ……

1.2 示例代码

httpurlconnectionexample.java

import java.net.*;
import java.io.*;
 
public class httpurlconnectionexample {
   
 
    private static httpurlconnection con;
 
    public static void main(string[] args) throws exception {
   
 
        url url = new url("https://www.example.com");
        con = (httpurlconnection) url.openconnection();
        con.setrequestmethod("get");
 
        bufferedreader in = new bufferedreader(new inputstreamreader(con.getinputstream()));
        string inputline;
        stringbuffer content = new stringbuffer();
        while ((inputline = in.readline()) != null) {
   
            content.append(inputline);
        }
        in.close();
        con.disconnect();
 
        system.out.println(content.tostring());
    }
}

1.3 执行结果

在这里插入图片描述


实现方式二、httpclient 库实现

2.1 简介

  • httpclient 是一个 http 客户端库,提供了向 http 服务器啊发送请求和处理响应的方法。

httpclient 支持多种请求协议,如 get、post 等,并允许开发者自由地设置 请求头请求参数连接池 等。httpclient 还提供了基于线程池地异步请求处理方式。

2.2 maven依赖

<!-- httpclient -->
<dependency>
	<groupid>org.apache.httpcomponents</groupid>
	<artifactid>httpclient</artifactid>
</dependency>
<!-- httpclient文件上传需要 -->
<dependency>
	<groupid>org.apache.httpcomponents</groupid>
	<artifactid>httpmime</artifactid>
</dependency>

2.3 示例代码

httpclientexample.java

import org.apache.http.httpentity;
import org.apache.http.client.methods.closeablehttpresponse;
import org.apache.http.client.methods.httpget;
import org.apache.http.impl.client.closeablehttpclient;
import org.apache.http.impl.client.httpclients;
import org.apache.http.util.entityutils;
 
public class httpclientexample {
   
 
    public static void main(string[] args) throws exception {
   
        closeablehttpclient httpclient = httpclients.createdefault();
        httpget httpget = new httpget("http://www.example.com");
        closeablehttpresponse response = httpclient.execute(httpget);
 
        try {
   
            httpentity entity = response.getentity();
            string result = entityutils.tostring(entity);
            entityutils.consume(entity);
 
            system.out.println(result);
        } finally {
   
            response.close();
        }
    }
}

2.4 执行结果

可以看到日志中详细打印了 请求信息响应信息

在这里插入图片描述

2.5 补充:配置文件(选配)

httpclient.properties

# 最大连接数
http_max_total=1000
# 并发数
http_default_max_perroute=80
# 创建连接的最长时间
http_validate_after_inactivity=5000
# 从连接池中获取到连接的最长时间
http_connection_request_timeout=500
http_connection_timeout=10000
# 数据传输的最长时间
http_socket_timeout=10000
waittime=30000
idlecontime=3
retrycount=3

2.6 补充:配置类(选配)

import java.security.keystore;
import javax.net.ssl.sslcontext;

import org.apache.http.headerelement;
import org.apache.http.headerelementiterator;
import org.apache.http.httpresponse;
import org.apache.http.client.config.requestconfig;
import org.apache.http.conn.connectionkeepalivestrategy;
import org.apache.http.conn.ssl.sslconnectionsocketfactory;
import org.apache.http.conn.ssl.trustallstrategy;
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;
import org.apache.http.message.basicheaderelementiterator;
import org.apache.http.protocol.http;
import org.apache.http.protocol.httpcontext;
import org.apache.http.ssl.sslcontexts;
import org.springframework.beans.factory.annotation.value;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.context.annotation.propertysource;

@configuration	//注解--配置类
@propertysource(value="classpath:/httpclient.properties")
public class httpclientconfig {
   

    @value("${http_max_total}")
    private int maxtotal = 800;

    @value("${http_default_max_perroute}")
    private int defaultmaxperroute = 80;

    @value("${http_validate_after_inactivity}")
    private int validateafterinactivity = 1000;

    @value("${http_connection_request_timeout}")
    private int connectionrequesttimeout = 5000;

    @value("${http_connection_timeout}")
    private int connecttimeout = 10000;

    @value("${http_socket_timeout}")
    private int sockettimeout = 20000;

    @value("${waittime}")
    private int waittime = 30000;

    @value("${idlecontime}")
    private int idlecontime = 3;

    @value("${retrycount}")
    private int retrycount = 3;

    @bean
    public poolinghttpclientconnectionmanager createpoolinghttpclientconnectionmanager() {
   
        poolinghttpclientconnectionmanager poolmanager = new poolinghttpclientconnectionmanager();
        poolmanager.setmaxtotal(maxtotal);
        poolmanager.setdefaultmaxperroute(defaultmaxperroute);
        poolmanager.setvalidateafterinactivity(validateafterinactivity);
        return poolmanager;
    }

    @bean
    public closeablehttpclient createhttpclient(poolinghttpclientconnectionmanager poolmanager) {
   
        httpclientbuilder httpclientbuilder = httpclientbuilder.create().setconnectionmanager(poolmanager);
        httpclientbuilder.setkeepalivestrategy(new connectionkeepalivestrategy() {
   

            @override
            public long getkeepaliveduration(httpresponse response, httpcontext context) {
   
                headerelementiterator iterator = new basicheaderelementiterator(response.headeriterator(http.conn_keep_alive));
                while (iterator.hasnext()) {
   
                    headerelement headerelement = iterator.nextelement();
                    string param = headerelement.getname();
                    string value = headerelement.getvalue();
                    if (null != value && param.equalsignorecase("timeout")) {
   
                        return long.parselong(value) * 1000;
                    }
                }
                return 30 * 1000;
            }
        });
        httpclientbuilder.setretryhandler(new defaulthttprequestretryhandler(retrycount, false));
        return httpclientbuilder.build();
    }

    @bean
    public sslcontext createsslcontext() throws exception {
   
        return sslcontexts.custom().loadtrustmaterial(keystore.getinstance(keystore.getdefaulttype()), new trustallstrategy()).build();
    }

    @bean
    public sslconnectionsocketfactory createsslconnectionsocketfactory(sslcontext sslcontext) {
   
        return new sslconnectionsocketfactory(sslcontext,
                new string[] {
    "tlsv1" },
                null,
                sslconnectionsocketfactory.getdefaulthostnameverifier());
    }

    @bean
    public requestconfig createrequestconfig() {
   
        return requestconfig.custom()
                .setconnectionrequesttimeout(connectionrequesttimeout) 	// 从连接池中取连接的超时时间
                .setconnecttimeout(connecttimeout)						// 连接超时时间
                .setsockettimeout(sockettimeout)						// 请求超时时间
                .build();
    }
}

2.7 补充:工具类(选配)

httpclientutil.java

import lombok.extern.slf4j.slf4j;
import org.apache.http.consts;
import org.apache.http.httpentity;
import org.apache.http.httpstatus;
import org.apache.http.namevaluepair;
import org.apache.http.client.config.requestconfig;
import org.apache.http.client.entity.urlencodedformentity;
import org.apache.http.client.methods.closeablehttpresponse;
import org.apache.http.client.methods.httpget;
import org.apache.http.client.methods.httppost;
import org.apache.http.entity.contenttype;
import org.apache.http.entity.stringentity;
import org.apache.http.entity.mime.httpmultipartmode;
import org.apache.http.entity.mime.multipartentitybuilder;
import org.apache.http.impl.client.closeablehttpclient;
import org.apache.http.message.basicnamevaluepair;
import org.apache.http.util.entityutils;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.stereotype.component;

import java.io.*;
import java.net.uri;
import java.net.urldecoder;
import java.net.urlencoder;
import java.util.arraylist;
import java.util.hashmap;
import java.util.list;
import java.util.<
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com