目录
实现方式一、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.<
发表评论