Java网络编程(二) OkHttp的使用
在之前的Java网络编程(一)中已经介绍了网络编程里最基本的概念,即套接字socket。然而socket虽然基础,但使用起来颇为麻烦、复杂,因此在开发网络功能的过程中,一般会使用其它第三方库进行网络请求。而本文将要介绍的就是一个比较经典的Java网络请求库--OkHttp。Java OkHttp是一个基于Java语言开发的开源库,可以用于HTTP和HTTP/2客户端请求。该库提供的API简单清晰,
目录
一、基本介绍
在之前的Java网络编程(一)中已经介绍了网络编程里最基本的概念,即套接字socket。然而socket虽然基础,但使用起来颇为麻烦、复杂,因此在开发网络功能的过程中,一般会使用其它第三方库进行网络请求。而本文将要介绍的就是一个比较经典的Java网络请求库--OkHttp。
Java OkHttp是一个基于Java语言开发的开源库,可以用于HTTP和HTTP/2客户端请求。该库提供的API简单清晰,功能丰富,能够极大简化开发者请求HTTP时的操作,因此被广泛地应用于Android应用和java程序中。
二、基本使用
2.1、package导入
如果是Android的gradel项目,那么在build.gradle中添加以下依赖语句
implementation("com.squareup.okhttp3:okhttp:4.9.0")
如果是maven项目,那么在pom文件中添加以下依赖即可
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
</dependencies>
想要最新版本或者下载本地jar包的可以去官网上找,地址如下
https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
2.2、同步请求
首先创建一个OkHttpClient,然后根据url构建最基本的request请求,再通过client对象和request对象来构造Call对象即可使用call对象的execute方法开始网络请求。
要注意的是,网络请求可能是一个耗时较长的过程,一般不允许在主线程中开启网络请求。而call对象的execute方法则是一个同步请求的方法,因此需要创建一个子线程来执行该方法,具体代码如下:
public void startGet() {
String url = "https://wwww.baidu.com";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).get().build();
final Call call = client.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
try {
final Response response = call.execute();
System.out.println("Request result:");
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
call.enqueue(callback);
}
2.3、异步请求
每次请求都需要我们手动new一个Thread对象的话太过麻烦,因此OkHttp也为开发者封装了异步请求的方法enqueue,调用该方法时不需要另开子线程调用,直接在主线程中执行即可。
使用异步请求之前,和同步请求一样,也需要先构建好client、request和call对象,此外还需要实现Callback接口,该接口对象将会在调用enqueue方法时作为参数传入,其中的onFailure和onResponse方法则分别在请求失败和请求成功时被执行。
private Callback callback = new Callback() {
@Override
public void onFailure(Call arg0, IOException arg1) {
System.out.println("Request failed");
}
@Override
public void onResponse(Call arg0, Response response) throws IOException {
System.out.println("Request result:");
System.out.println(response.body().string());
}
};
public void aysncGet() {
String url = "https://wwww.baidu.com";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).get().build();
Call call = client.newCall(request);
call.enqueue(callback);
}
2.4、post请求
之前介绍的两个都是简单的get请求,实际应用过程中还有一个非常重要的post请求。使用 post请求相比get请求,其实就是多了一个RequstBody对象来携带我们要发送给网络服务器的数据。一个最基本的携带表单form信息的post请求示例如下:
public void postForm() {
String url = "https://wwww.baidu.com";
OkHttpClient client = new OkHttpClient();
RequestBody body = new FormBody.Builder()
.add("username", "name")
.add("password", "666")
.build();
Request request = new Request.Builder().url(url).post(body).build();
Call call = client.newCall(request);
call.enqueue(callback);
}
2.5、post发送json信息
除了表单信息之外,json文件也是网络请求中常见的格式,上传json信息的示例如下:
public void postJson() {
String url = "https://wwww.baidu.com";
String json = "{\"username\":\"name\",\"password\":\"666\"}";
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(json, mediaType);
Request request = new Request.Builder().url(url).post(body).build();
Call call = client.newCall(request);
call.enqueue(callback);
}
不难看出,相较于form信息,发送json信息时其实就是RequstBody对象有所改变 。在解析json数据时利用到了MediaType对象,MediaType指的是要传递的数据的MIME类型,是用来描述请求/响应 body 的内容类型。关于MIME类型具体包含哪些,它们的表达形式又是什么,可以网上查阅其它资料,笔者参考的是该链接中的介绍:MIME 参考手册
2.6、post发送文件信息
发送文件信息和发送json信息类似,也是利用不同的MediaType对象解析完成file对象后,将其放入RequestBody中,具体示例代码如下:
public void postFile() {
String url = "https://wwww.baidu.com";
File file = new File("./test.jpg");
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("image/jpeg");
RequestBody body = RequestBody.create(file, mediaType);
Request request = new Request.Builder().url(url).post(body).build();
Call call = client.newCall(request);
call.enqueue(callback);
}
2.7、post发送多种请求信息
有时实际应用还需要我们同时发送多种请求信息,此时一般会利用MultipartBody对象帮助我们将多种对象信息组合起来。代码如下:
public void postMult() {
String url = "https://wwww.baidu.com";
String json = "{\"username\":\"name\",\"password\":\"666\"}";
File file = new File("./test.jpg");
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("image/jpeg");
RequestBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("username", "name")
.addFormDataPart("password", "666")
.addPart(RequestBody.create(json, MediaType.parse("application/json")))
.addFormDataPart("image", "test.png", RequestBody.create(file, mediaType))
.build();
Request request = new Request.Builder().url(url).post(body).build();
Call call = client.newCall(request);
call.enqueue(callback);
}
三、小结
本文介绍了OkHttp的基本功能和常用API,掌握以上请求的使用基本可以满足大部分的网络请求使用场景。
OkHttp返回的response中保存了返回结果,调用response.body().string()之后可以得到一份html文件内容,而要进一步解析该内容以获取其中的有效信息则不是OkHttp要做的了。Java语言中,一般推荐DOM库或者Jsoul库来对网络请求返回的信息做进一步的处理,感兴趣的读者可以自行尝试。
笔者萌新一枚,如有错漏之处还望指正。
本文主要参考了以下文章:
更多推荐
所有评论(0)