一、简介
Unirest-Java是一个轻量级的HTTP客户端库,用于在Java应用程序中发送HTTP请求。
它提供了简单易用的API,可以方便地处理GET、POST、PUT、DELETE等HTTP方法。
Unirest-Java支持异步和同步请求,可以轻松地与JSON、XML等数据格式进行交互。此外,它还支持文件上传和下载、Cookie管理等功能。
总之,Unirest-Java是一个功能强大且易于使用的HTTP客户端库,适用于各种Java应用程序。
官网:http://kong.github.io/unirest-java/
二、安装
1、Java8
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-java</artifactId>
<version>3.14.1</version>
</dependency>
1、Java11以上
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.konghq/unirest-java-bom -->
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-java-bom</artifactId>
<version>4.0.12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.konghq/unirest-java-core -->
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-java-core</artifactId>
</dependency>
<!-- pick a JSON module if you want to parse JSON include one of these: -->
<!-- Google GSON -->
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-object-mappers-gson</artifactId>
</dependency>
<!-- OR maybe you like Jackson better? -->
<dependency>
<groupId>com.konghq</groupId>
<artifactId>unirest-objectmapper-jackson</artifactId>
</dependency>
</dependencies>
三、GET请求
使用Unirest库发送一个HTTP GET请求到"http://localhost/{fruit}“,其中”{fruit}“是一个路由参数,其值为"apple”。然后,它将响应转换为字符串。
Unirest.get("http://localhost/{fruit}")
.routeParam("fruit", "apple")
.asString();
使用Unirest库发送一个HTTP GET请求到"http://localhost",并添加了两个查询参数:“fruit"的值为"apple”,“droid"的值为"R2D2”。最后,将响应转换为字符串。
Unirest.get("http://localhost")
.queryString("fruit", "apple")
.queryString("droid", "R2D2")
.asString();
使用Unirest库发送一个HTTP GET请求到"http://localhost",并添加了两个查询参数:"fruit"的值为一个包含"apple"和"orange"的列表,另一个查询参数是一个不可变的映射(ImmutableMap),其中包含了"droid"和"beatle"两个键值对。最后,将响应转换为字符串。
Unirest.get("http://localhost")
.queryString("fruit", Arrays.asList("apple", "orange"))
.queryString(ImmutableMap.of("droid", "R2D2", "beatle", "Ringo"))
.asString();
使用Unirest库发送一个HTTP GET请求到"http://localhost",并设置了两个请求头:“Accept"设置为"application/json”,表示期望服务器返回JSON格式的数据;“x-custom-header"设置为"hello”,表示自定义了一个名为"x-custom-header"的请求头。最后,将响应转换为字符串。
Unirest.get("http://localhost")
.header("Accept", "application/json")
.header("x-custom-header", "hello")
.asString();
使用Unirest库发送一个HTTP GET请求到"http://localhost",并设置了基本的认证信息。其中,"user"和"password1!"分别表示用户名和密码。
最后,将响应转换为字符串。
Unirest.get("http://localhost")
.basicAuth("user", "password1!")
.asString();
使用Unirest库发送一个HTTP GET请求到"https://somewhere/dogs",并将响应结果转换为PagedList类型。
具体来说,代码中的.asPaged()方法用于处理分页数据。它接受两个参数:
r -> r.asObject(Doggos.class):这是一个Lambda表达式,用于将响应结果转换为Doggos类型的对象列表。其中,r表示响应结果,r.asObject(Doggos.class)表示将响应结果转换为Doggos类型的对象。
r -> r.getHeaders().getFirst(“nextPage”):这也是一个Lambda表达式,用于获取下一页的链接。其中,r表示响应结果,r.getHeaders().getFirst(“nextPage”)表示从响应头中获取名为"nextPage"的第一个值,即下一页的链接。
通过这两个Lambda表达式,代码可以自动处理分页数据,并将每一页的数据转换为Doggos类型的对象列表。
最终,结果将被存储在名为result的PagedList变量中。
PagedList<Doggos> result = Unirest.get("https://somewhere/dogs")
.asPaged(
r -> r.asObject(Doggos.class),
r -> r.getHeaders().getFirst("nextPage")
);
使用Unirest库发送一个HTTP GET请求到"https://some.custom.secured.place.com",并获取响应结果的字符串表示。
首先,Unirest.config()用于配置Unirest客户端的行为。在这个例子中,它设置了客户端证书存储路径为"/path/mykeystore.p12",并指定了密码为"password1!"。这意味着在发送请求时,客户端将使用指定的证书进行身份验证。
然后,Unirest.get(“https://some.custom.secured.place.com”)用于创建一个GET请求,目标URL为"https://some.custom.secured.place.com"。
最后,.asString()方法用于将响应结果转换为字符串表示。这样,你可以对返回的数据进行处理或分析。
Unirest.config()
.clientCertificateStore("/path/mykeystore.p12", "password1!");
Unirest.get("https://some.custom.secured.place.com")
.asString();
代理
有时您需要通过代理进行隧道传输。Unirest 可以配置为执行此操作。请注意,除非您要将其构建到 URL 本身中,否则无法按请求配置经过身份验证的代理。
// Configure with authentication:
Unirest.config().proxy("proxy.com", 7777, "username", "password1!");
// or without
Unirest.config().proxy("proxy.com", 7777);
// or pass it in the request. This will override any proxy done in the config
// currently only unauthenticated proxies work
Unirest.get(MockServer.GET)
.proxy("proxy.com", 7777)
.asString();
四、POST请求
使用Unirest库发送一个HTTP POST请求到"http://localhost/post这段代码是使用Unirest库发送一个HTTP POST请求到"http://localhost/post",并获取响应结果的JsonNode表示。
具体来说,代码执行了以下操作:
使用Unirest.post()方法创建一个POST请求,目标URL为"http://localhost/post"。
通过.header(“accept”, “application/json”)设置请求头中的"Accept"字段为"application/json",表示期望服务器返回JSON格式的数据。
通过.queryString(“apiKey”, “123”)添加查询参数"apiKey",其值为"123"。
通过.field(“parameter”, “value”)和.field(“firstname”, “Gary”)分别添加两个表单字段,分别为"parameter"和"firstname",它们的值分别为"value"和"Gary"。
最后,通过.asJson()方法将响应结果转换为JsonNode类型,并将其赋值给变量response。
HttpResponse<JsonNode> response = Unirest.post("http://localhost/post")
.header("accept", "application/json")
.queryString("apiKey", "123")
.field("parameter", "value")
.field("firstname", "Gary")
.asJson();
使用Unirest库发送一个HTTP POST请求到"http://localhost",并这段代码是使用Unirest库发送一个HTTP POST请求到"http://localhost",并设置请求体的内容为"This is the entire body"。最后通过.asEmpty()方法指定响应结果的处理方式为空处理。
具体来说,代码执行了以下操作:
使用Unirest.post(“http://localhost”)创建一个POST请求,目标URL为"http://localhost"。
通过.body(“This is the entire body”)设置请求体的内容为"This is the entire body"。
最后通过.asEmpty()方法指定响应结果的处理方式为空处理。这意味着在接收到响应后,不会对响应内容进行任何处理或解析。
Unirest.post("http://localhost")
.body("This is the entire body")
.asEmpty();
使用Unirest库发送一个HTTP POST请求到"http://localhost"。它设置了请求头中的"Content-Type"为"application/json",表示请求体中的数据类型是JSON格式。然后,它将一个名为"Bob"的SomeUserObject对象作为请求体发送出去。最后,通过调用.asEmpty()方法指定响应结果的处理方式为空处理,即不对响应内容进行任何处理或解析。
Unirest.post("http://localhost")
.header("Content-Type", "application/json")
.body(new SomeUserObject("Bob"))
.asEmpty();
使用Unirest库发送一个JSON Patch请求。具体来说,它执行了以下操作:
向"http://localhost"发送一个JSON Patch请求。
在"/fruits/-“路径下添加一个名为"Apple"的元素。
从”/bugs"路径下移除元素。
将"/lastname"路径下的值替换为"Flintstone"。
测试"/firstname"路径下的值是否等于"Fred"。
将"/old/location"路径下的元素移动到"/new/location"路径下。
将"/original/location"路径下的元素复制到"/new/location"路径下。
将结果以JSON格式返回。
Unirest.jsonPatch("http://localhost")
.add("/fruits/-", "Apple")
.remove("/bugs")
.replace("/lastname", "Flintstone")
.test("/firstname", "Fred")
.move("/old/location", "/new/location")
.copy("/original/location", "/new/location")
.asJson();
使用Unirest库发送一个POST请求到"http://localhost"。它向该URL发送两个字段,一个是"fruit",值为"apple",另一个是"droid",值为"R2D2"。最后,它调用asEmpty()方法来发送请求并返回一个空的响应。
Unirest.post("http://localhost")
.field("fruit", "apple")
.field("droid", "R2D2")
.asEmpty();
五、PUT请求
HttpResponse<JsonNode> response = Unirest.put(url)
.header("Content-Type", "application/json")
.body(json)
.asJson();
六、DELETE请求
try {
HttpResponse<String> response = Unirest.delete(url).asString();
System.out.println("Status code: " + response.getStatus());
System.out.println("Response body: " + response.getBody());
} catch (UnirestException e) {
e.printStackTrace();
}
七、文件上传
Unirest.post("http://localhost")
.field("upload", new File("/MyFile.zip"))
.asEmpty();
对于大文件,您可能需要使用 InputStream。如果需要,请为其传递文件名。 我们在这里使用 FileInputStream,但它实际上可以是任何类型的 InputStream。
InputStream file = new FileInputStream(new File("/MyFile.zip"));
Unirest.post("http://localhost")
.field("upload", file, "MyFile.zip")
.asEmpty();
上传进度监控
如果要上传大文件,则可能需要向用户提供一些进度条时间。您可以通过提供 ProgresMonitor 来监视此进度。
Unirest.post("http://localhost")
.field("upload", new File("/MyFile.zip"))
.uploadMonitor((field, fileName, bytesWritten, totalBytes) -> {
updateProgressBarWithBytesLeft(totalBytes - bytesWritten);
})
.asEmpty();
异步请求
有时,大多数时候,你希望你的应用程序是异步的而不是阻塞的,Unirest 在 Java 中使用匿名回调或直接方法放置来支持这一点。所有请求类型还支持异步版本。
CompletableFuture<HttpResponse<JsonNode>> future = Unirest.post("http://localhost/post")
.header("accept", "application/json")
.field("param1", "value1")
.field("param2", "value2")
.asJsonAsync(response -> {
int code = response.getStatus();
JsonNode body = response.getBody();
});
八、文件下载
有时,您只想下载文件,或者将响应正文捕获到文件中。Unirest 可以两者兼而有之。只需告诉 Unirest 您要将文件放在哪里即可。
File result = Unirest.get("http://some.file.location/file.zip")
.asFile("/disk/location/file.zip")
.getBody();
下载进度监控
如果要上传大文件,则可能需要向用户提供一些进度条时间。您可以通过提供 ProgresMonitor 来监视此进度。
Unirest.get("http://localhost")
.downLoadMonitor((b, fileName, bytesWritten, totalBytes) -> {
updateProgressBarWithBytesLeft(totalBytes - bytesWritten);
})
.asFile("/disk/location/file.zip");