目录
1. HttpClient介绍
2. 创建工程
3. 发送HTTP POST请求
3.1 使用String形式参数构建Get请求
3.2 使用URI形式构建Get请求
1. HttpClient介绍
尽管JDK中有通过HTTP访问资源的API, 但其功能和灵活性受到限制。HttpClient隶属于Apache的HttpComponents项目,它提供了丰富和更高效的HTTP访问方式,主要特点如下:
1. 纯Java实现,支持HTTP1.0和HTTP1.1.
2. 支持HTTPS。
3. 支持通过CONNECT方法建立隧道连接。
4. 支持Basic,Digest和NTLM等鉴权方式。
5. 支持设置连接超时。
6. 源代码基于Apache许可协议,因此是免费开源的。
2. 创建工程
创建Maven工程,引入依赖如下。
org.apache.httpcomponents
httpclient
4.5.9
3. 发送HTTP POST请求
实现步骤:
1. 通过HttpClients类的静态方法创建HTTP客户端。
2. 通过HttpGet实例化GET请求。其他的HTTP请求也有响应的类,如HttpDelete, HttpHead, HttpPost......
3. 构建Get请求
4. 通过HTTP客户端执行请求得到服务器响应,并且打印到控制台。
5. 捕获异常。
3.1 使用String形式参数构建Get请求
构建GET请求中,我们首先使用String形式。特点是语法简单,但结构不够清晰。遇到空格时,这种方式需要手动编码,手动把空格换成+ 号,如 " http://localhost:8080/mobilePhone?model=iphone+6S"
尽管JDK中有通过HTTP访问资源的API, 但其功能和灵活性受到限制。HttpClient隶属于Apache的HttpComponents项目,它提供了丰富和更高效的HTTP访问方式,主要特点如下:
1. 纯Java实现,支持HTTP1.0和HTTP1.1.
2. 支持HTTPS。
3. 支持通过CONNECT方法建立隧道连接。
4. 支持Basic,Digest和NTLM等鉴权方式。
5. 支持设置连接超时。
6. 源代码基于Apache许可协议,因此是免费开源的。
创建Maven工程,引入依赖如下。
org.apache.httpcomponents httpclient4.5.9
3. 发送HTTP POST请求
实现步骤:
1. 通过HttpClients类的静态方法创建HTTP客户端。
2. 通过HttpGet实例化GET请求。其他的HTTP请求也有响应的类,如HttpDelete, HttpHead, HttpPost......
3. 构建Get请求
4. 通过HTTP客户端执行请求得到服务器响应,并且打印到控制台。
5. 捕获异常。
3.1 使用String形式参数构建Get请求
构建GET请求中,我们首先使用String形式。特点是语法简单,但结构不够清晰。遇到空格时,这种方式需要手动编码,手动把空格换成+ 号,如 " http://localhost:8080/mobilePhone?model=iphone+6S"
实现步骤:
1. 通过HttpClients类的静态方法创建HTTP客户端。
2. 通过HttpGet实例化GET请求。其他的HTTP请求也有响应的类,如HttpDelete, HttpHead, HttpPost......
3. 构建Get请求
4. 通过HTTP客户端执行请求得到服务器响应,并且打印到控制台。
5. 捕获异常。
构建GET请求中,我们首先使用String形式。特点是语法简单,但结构不够清晰。遇到空格时,这种方式需要手动编码,手动把空格换成+ 号,如 " http://localhost:8080/mobilePhone?model=iphone+6S"
代码演示
package http;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import sun.net.www.http.HttpClient;
public class TestGet {
public static void main(String[] args) {
String url = "http://localhost:8080/mobilePhone?model=iPhone+6S";
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet1 = new HttpGet(url);
CloseableHttpResponse response = null;
try {
response = client.execute(httpGet1);
System.out.println(EntityUtils.toString(response.getEntity()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果
3.2 使用URI形式构建Get请求
URI ( Uniform Resource Identifier), 统一资源标识符。 特点是结构清晰,但构建过程较为复杂,而且构建过程容易出错,导致URI语法异常。针对空格情况,这种方式可以自动编码。
如下案例我们可以看到,URI形式构建较为复杂。
package http;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
public class TestGet2 {
public static void main(String[] args) {
CloseableHttpClient client = HttpClients.createDefault();
URI uri = null;
try {
uri = new URIBuilder().setScheme("http").setHost("localhost").setPort(8080).setPath("/mobilePhone")
.setParameter("model", "iPhone 6S").build();
} catch (URISyntaxException e) {
e.printStackTrace();
}
HttpGet httpGet2 = new HttpGet(uri);
CloseableHttpResponse response = null;
try {
response = client.execute(httpGet2);
System.out.println(EntityUtils.toString(response.getEntity()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
URI ( Uniform Resource Identifier), 统一资源标识符。 特点是结构清晰,但构建过程较为复杂,而且构建过程容易出错,导致URI语法异常。针对空格情况,这种方式可以自动编码。
如下案例我们可以看到,URI形式构建较为复杂。
运行结果



