一、简介
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 withoutUnirest.config().proxy("proxy.com", 7777);// or pass it in the request. This will override any proxy done in the config// currently only unauthenticated proxies workUnirest.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");