Http工具包,封装 OkHttp,自动解析,链式用法、异步同步、前后端通用
<dependency>
<groupId>com.ejlchina</groupId>
<artifactId>httputils</artifactId>
<version>1.0.2</version>
</dependency>
compile 'com.ejlchina:httputils:1.0.2'
所有 HttpUtils.sync(...) 均为同步请求方法
// 最终路径 http://api.demo.com/users?name=Jack
HttpResult<User, ?> result = HttpUtils.sync("http://api.demo.com/users", User.class)
.addUrlParam("name", "Jack")
.get(); // GET请求
int status = result.getStatus(); // 得到HTTP状态码
Headers headers = result.getHeaders(); // 得到返回头
User user = result.getOkData(); // 得到目标数据
所有 HttpUtils.async(...) 均为异步请求方法
// 最终路径为 http://api.demo.com/users/1
HttpUtils.async("http://api.demo.com/users/{id}", User.class)
.addPathParam("id", 1)
.setOnSuccess((int status, Headers headers, User user) -> {
// 请求成功处理
})
.get(); // GET请求
HttpClient.setBaseUrl("http://api.demo.com");
该配置全局生效
在配置了 BaseUrl 之后,具体的请求便可以省略 BaseUrl 部分,例如:
HttpUtils.sync("/users").get() // http://api.demo.com/users
HttpUtils.sync("/auth/signin") // http://api.demo.com/auth/signin
.addBodyParam("username", "Jackson")
.addBodyParam("password", "xxxxxx")
.post() // POST请求
在配置了 BaseUrl 之后,仍然可以请求全路径的接口,如:
HttpUtils.sync("https://www.baidu.com").get()
GET 请求(同步异步请求方法一致)
HttpUtils.sync("/users").get()
POST 请求(同步异步请求方法一致)
HttpUtils.sync("/users")
.addJsonParam("name", "Jack")
.addJsonParam("age", 20)
.post()
PUT 请求(同步异步请求方法一致)
HttpUtils.sync("/users/1")
.addJsonParam("name", "Jack")
.put()
DELETE 请求(同步异步请求方法一致)
HttpUtils.sync("/users/1").delete()
只有异步请求才可以被取消
异步请求的 get、post、put、delete方法返回一个HttpCall对象,该对象可以查看请求执行的状态,也可以取消请求
HttpCall call = HttpUtils.async("/users/1")
.setOnSuccess((int status, Headers headers, Object user) -> {
})
.get();
call.cancel(); // 取消请求
System.out.println("是否完成: " + call.isDone()); // false
System.out.println("是否取消: " + call.isCanceled()); // true
只有异步请求才可以设置回调函数
HttpUtils.async("/users/1", User.class, Error.class)
.setOnSuccess((int status, Headers headers, User user) -> {
// 成功回调,状态码在[200, 300)之间(根据 User.class 自动解析出 user 对象)
})
.setOnFailure((int status, Headers headers, Error error) -> {
// 失败回调,状态码在[200, 300)之外(根据 Error.class 自动解析出 error 对象)
})
.setOnException((Exception e) -> {
// 异常回调
})
.setOnComplete((int state) -> {
// 完成回调,无论成功失败都会执行
})
.get();
HttpUtils.async("/files/report.xlsx")
.setOnResponse((int status, Headers headers, ResponseBody body) -> {
// 响应回调(设置了OnResponse,就不可以再设置 OnSuccess 和 OnFailure 回调)
})
.setOnException((Exception e) -> {
// 异常回调
})
.setOnComplete((int state) -> {
// 完成回调,无论成功失败都会执行
})
.get();
HttpUtils.sync(...) 和 HttpUtils.async(...) 最多有三个参数:第一个为url字符串,第二个为响应成功数据的目标解析类型,第三个为响应失败数据的目标解析类型
异步请求成功返回数据 解析为 Book 对象
HttpUtils.async("/books/1", Book.class)
.setOnSuccess((int status, Headers headers, Book book) -> {
})
.get();
异步请求成功返回数据 解析为 Book 对象,请求失败返回数据 解析为 String 对象
HttpUtils.async("/books/1", Book.class, String.class)
.setOnSuccess((int status, Headers headers, Book book) -> {
})
.setOnFailure((int status, Headers headers, String error) -> {
})
.get();
异步请求成功返回数据 解析为 Book 列表
HttpUtils.async("/books", new TypeReference<List<Book>>(){})
.setOnSuccess((int status, Headers headers, List<Book> books) -> {
})
.get();
同步请求成功返回数据 解析为 Book 对象
Book book = HttpUtils.sync("/books/1", Book.class).get().getOkData();
同步请求成功返回数据 解析为 Book 对象,请求失败返回数据 解析为 String 对象
HttpResult<User, String> result = HttpUtils.sync("/books/1", Book.class, String.class).get();
Book book = result.getOkData();
String error = result.getFailData();
同步请求成功返回数据 解析为 Book 列表
List<Book> books = HttpUtils.sync("/books", new TypeReference<List<Book>>(){})
.get().getOkData();
单个添加(同步异步添加方法一样)
HttpUtils.sync("/orders")
.addHeader("Access-Token", "xxxxxx")
.addHeader("Content-Type", "application/json")
.get();
多个添加(同步异步添加方法一样)
Map<String, String> headers = new HashMap<>()
headers.put("Access-Token", "xxxxxx");
headers.put("Accept", "application/json");
HttpUtils.sync("/orders")
.addHeader(headers)
.get();
路径参数用于替换URL字符串中的占位符
单个添加(同步异步添加方法一样)
HttpUtils.sync("/shops/{shopName}/products/{productId}")
.addPathParam("shopName", "taobao")
.addPathParam("productId", 20)
.get();
多个添加(同步异步添加方法一样)
Map<String, String> params = new HashMap<>()
params.put("shopName", "taobao");
params.put("productId", 20);
HttpUtils.sync("/shops/{shopName}/products/{productId}")
.addPathParam(params)
.get();
查询参数(URL参数)用于拼接在 url 字符串的 ? 之后
单个添加(同步异步添加方法一样)
HttpUtils.sync("/products")
.addUrlParam("name", "手机")
.addUrlParam("tag", "5G")
.get();
多个添加(同步异步添加方法一样)
Map<String, String> params = new HashMap<>()
params.put("name", "手机");
params.put("tag", 5G);
HttpUtils.sync("/products")
.addUrlParam(params)
.get();
表单参数(Budy参数)以 key=value& 的形式携带与请求报文体内
单个添加(同步异步添加方法一样)
HttpUtils.sync("/signin")
.addBodyParam("username", "Jackson")
.addBodyParam("password", "xxxxxx")
.post();
多个添加(同步异步添加方法一样)
Map<String, String> params = new HashMap<>()
params.put("username", "Jackson");
params.put("password", "xxxxxx");
HttpUtils.sync("/signin")
.addBodyParam(params)
.post();
JSON参数 json 字符串的形式携带与请求报文体内
单个添加(同步异步添加方法一样)
HttpUtils.sync("/signin")
.addJsonParam("username", "Jackson")
.addJsonParam("password", "xxxxxx")
.post();
多个添加(同步异步添加方法一样)
Map<String, String> params = new HashMap<>()
params.put("username", "Jackson");
params.put("password", "xxxxxx");
HttpUtils.sync("/signin")
.addJsonParam(params)
.post();
添加JSON字符串
HttpUtils.sync("/signin")
.setRequestJson("\"username\":\"Jackson\",\"password\":\"xxxxxx\"")
.post();
Java Bean 自动转 JSON
Login login = new Login();
login.setUsername("Jackson");
login.setPassword("xxxxxx");
HttpUtils.sync("/signin")
.setRequestJson(login)
.post();
同步和异步添加文件方法是一样的
上传本地文件
File file1 = new File("D:/1.jpg");
File file2 = new File("D:/2.jpg");
HttpUtils.sync("/upload")
.addFileParam("image1", file1)
.addFileParam("image2", file2)
.post();
使用文件输入流上传
// 获得文件的输入流
InputStream input = ...
HttpUtils.sync("/upload")
.addFileParam("image", "jpg", input)
.post();
使用文件字节数组上传
// 获得文件的字节数组
byte[] content = ...
HttpUtils.sync("/upload")
.addFileParam("image", "jpg", content)
.post();
文件参数和表单参数可以一起添加
File file = new File("D:/首页广告.jpg");
HttpUtils.sync("/messages")
.addBodyParam("name", "广告图")
.addFileParam("image", file)
.post();
// HttpClient 全局配置
HttpClient.config((Builder builder) -> {
// 配置连接池 最小10个连接(不配置默认为 5)
builder.connectionPool(new ConnectionPool(10, 5, TimeUnit.MINUTES));
// 配置连接超时时间
builder.connectTimeout(20, TimeUnit.SECONDS);
// 其它配置: 拦截器、SSL、缓存、代理...
});
该配置全局生效
如何想改变执行回调函数的线程时,可以配置回调函数执行器
例如在Android里,配置所有的回调函数都在UI线程里执行(在BaseActivity 的 onCreate 方法内配置以下代码)
HttpClient.setExecutor((Runnable run) -> {
runOnUiThread(run);
});
该配置只对异步请求生效
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。