門戶網(wǎng)站類型北京疫情消息1小時(shí)前
目錄
一、基本介紹
二、基本使用
2.1、package導(dǎo)入
2.2、同步請(qǐng)求
2.3、異步請(qǐng)求
2.4、post請(qǐng)求
2.5、post發(fā)送json信息
2.6、post發(fā)送文件信息
2.7、post發(fā)送多種請(qǐng)求信息
三、小結(jié)
一、基本介紹
在之前的Java網(wǎng)絡(luò)編程(一)中已經(jīng)介紹了網(wǎng)絡(luò)編程里最基本的概念,即套接字socket。然而socket雖然基礎(chǔ),但使用起來頗為麻煩、復(fù)雜,因此在開發(fā)網(wǎng)絡(luò)功能的過程中,一般會(huì)使用其它第三方庫進(jìn)行網(wǎng)絡(luò)請(qǐng)求。而本文將要介紹的就是一個(gè)比較經(jīng)典的Java網(wǎng)絡(luò)請(qǐng)求庫--OkHttp。
Java OkHttp是一個(gè)基于Java語言開發(fā)的開源庫,可以用于HTTP和HTTP/2客戶端請(qǐng)求。該庫提供的API簡單清晰,功能豐富,能夠極大簡化開發(fā)者請(qǐng)求HTTP時(shí)的操作,因此被廣泛地應(yīng)用于Android應(yīng)用和java程序中。
二、基本使用
2.1、package導(dǎo)入
如果是Android的gradel項(xiàng)目,那么在build.gradle中添加以下依賴語句
implementation("com.squareup.okhttp3:okhttp:4.9.0")
如果是maven項(xiàng)目,那么在pom文件中添加以下依賴即可
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.0</version></dependency></dependencies>
想要最新版本或者下載本地jar包的可以去官網(wǎng)上找,地址如下
https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp????????
2.2、同步請(qǐng)求
首先創(chuàng)建一個(gè)OkHttpClient,然后根據(jù)url構(gòu)建最基本的request請(qǐng)求,再通過client對(duì)象和request對(duì)象來構(gòu)造Call對(duì)象即可使用call對(duì)象的execute方法開始網(wǎng)絡(luò)請(qǐng)求。
要注意的是,網(wǎng)絡(luò)請(qǐng)求可能是一個(gè)耗時(shí)較長的過程,一般不允許在主線程中開啟網(wǎng)絡(luò)請(qǐng)求。而call對(duì)象的execute方法則是一個(gè)同步請(qǐng)求的方法,因此需要?jiǎng)?chuàng)建一個(gè)子線程來執(zhí)行該方法,具體代碼如下:
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() {@Overridepublic 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、異步請(qǐng)求
每次請(qǐng)求都需要我們手動(dòng)new一個(gè)Thread對(duì)象的話太過麻煩,因此OkHttp也為開發(fā)者封裝了異步請(qǐng)求的方法enqueue,調(diào)用該方法時(shí)不需要另開子線程調(diào)用,直接在主線程中執(zhí)行即可。
使用異步請(qǐng)求之前,和同步請(qǐng)求一樣,也需要先構(gòu)建好client、request和call對(duì)象,此外還需要實(shí)現(xiàn)Callback接口,該接口對(duì)象將會(huì)在調(diào)用enqueue方法時(shí)作為參數(shù)傳入,其中的onFailure和onResponse方法則分別在請(qǐng)求失敗和請(qǐng)求成功時(shí)被執(zhí)行。
private Callback callback = new Callback() {@Overridepublic void onFailure(Call arg0, IOException arg1) {System.out.println("Request failed");}@Overridepublic 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請(qǐng)求
之前介紹的兩個(gè)都是簡單的get請(qǐng)求,實(shí)際應(yīng)用過程中還有一個(gè)非常重要的post請(qǐng)求。使用?post請(qǐng)求相比get請(qǐng)求,其實(shí)就是多了一個(gè)RequstBody對(duì)象來攜帶我們要發(fā)送給網(wǎng)絡(luò)服務(wù)器的數(shù)據(jù)。一個(gè)最基本的攜帶表單form信息的post請(qǐng)求示例如下:
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發(fā)送json信息
除了表單信息之外,json文件也是網(wǎng)絡(luò)請(qǐng)求中常見的格式,上傳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信息,發(fā)送json信息時(shí)其實(shí)就是RequstBody對(duì)象有所改變?。在解析json數(shù)據(jù)時(shí)利用到了MediaType對(duì)象,MediaType指的是要傳遞的數(shù)據(jù)的MIME類型,是用來描述請(qǐng)求/響應(yīng) body 的內(nèi)容類型。關(guān)于MIME類型具體包含哪些,它們的表達(dá)形式又是什么,可以網(wǎng)上查閱其它資料,筆者參考的是該鏈接中的介紹:MIME 參考手冊(cè)
2.6、post發(fā)送文件信息
發(fā)送文件信息和發(fā)送json信息類似,也是利用不同的MediaType對(duì)象解析完成file對(duì)象后,將其放入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發(fā)送多種請(qǐng)求信息
有時(shí)實(shí)際應(yīng)用還需要我們同時(shí)發(fā)送多種請(qǐng)求信息,此時(shí)一般會(huì)利用MultipartBody對(duì)象幫助我們將多種對(duì)象信息組合起來。代碼如下:
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);}
三、小結(jié)
本文介紹了OkHttp的基本功能和常用API,掌握以上請(qǐng)求的使用基本可以滿足大部分的網(wǎng)絡(luò)請(qǐng)求使用場景。
OkHttp返回的response中保存了返回結(jié)果,調(diào)用response.body().string()之后可以得到一份html文件內(nèi)容,而要進(jìn)一步解析該內(nèi)容以獲取其中的有效信息則不是OkHttp要做的了。Java語言中,一般推薦DOM庫或者Jsoul庫來對(duì)網(wǎng)絡(luò)請(qǐng)求返回的信息做進(jìn)一步的處理,感興趣的讀者可以自行嘗試。
筆者萌新一枚,如有錯(cuò)漏之處還望指正。
本文主要參考了以下文章:
OkHttp的完整指南 - 掘金