5--安卓網路程式設計之OKHttp3的使用
零、前言
安卓的網路程式設計,服務端的知識是必不可少的,否則不知道該請求什麼url,或不明白服務端是什麼樣的,總像是拼圖少了一半
還好本人會些SpringBoot壓箱底,這裡提供了可訪問的URL供大家測試,以及後端的具體實現的連結,感興趣的可以看一下
本文 安卓端
基本上是根據 慕課網上hyman的
ofollow,noindex">Android網路框架-OkHttp使用 敲的,懶得看文章的可以去看看視訊
不過版本OKHttp3.X和視訊中2.X稍有不同,還有本文服務端使用SpringBoot與視訊不同
本文測試的url為已在伺服器上,可訪問:
GET請求測試地址: http://www.toly1994.com:8089/swords/find/21
POST請求測試地址: http://www.toly1994.com:8089/swords/postFind 引數:id=26
具體url的建立方法可詳見: SpringBoot篇:SpringBoot-07-之資料庫JPA(CRUD)
POST請求體中新增文字: http://www.toly1994.com:8089/PostString
具體url的建立方法可詳見: SpringBoot篇:SpringBoot-02-之引數傳遞
POST請求體中上傳檔案: http://www.toly1994.com:8089/PostFile
通過模擬表單上傳檔案: http://www.toly1994.com:8089/upload
具體url的建立方法可詳見: SpringBoot篇:SpringBoot-02-之引數傳遞
依賴
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
一、GET請求
注:回撥的Callback在子執行緒執行,不能更新UI
private void doGet() { //1.獲取OkHttpClient物件 OkHttpClient okHttpClient = new OkHttpClient(); //2.獲取Request物件 Request request = new Request.Builder().get().url("http://www.baidu.com").build(); //3.將Request封裝為Call物件 Call call = okHttpClient.newCall(request); //4.執行Call call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "onFailure: " + e); } @Override public void onResponse(Call call, Response response) throws IOException { Log.e(TAG, "onResponse: " + response.body().string()); } }); }
將訪問百度的伺服器,伺服器返回的內容體便是百度首頁的html

百度首頁html.png
二、POST請求
private void doPost() { //1.獲取OkHttpClient物件 OkHttpClient okHttpClient = new OkHttpClient(); //2.構造RequestBody FormBody body = new FormBody.Builder().add("id", "26").build(); Request request = new Request.Builder().url(Cons.BASE_URL+"swords/postFind").post(body).build(); //3.將Request封裝為Call物件 Call call = okHttpClient.newCall(request); //4.執行Call call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "onFailure: " + e); } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); Log.e(TAG, "onResponse: " + result); runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result)); } }); }

post請求.png
三、POST請求的請求體中新增文字
private void doPostStr() { //1.獲取OkHttpClient物件 OkHttpClient okHttpClient = new OkHttpClient(); //2.構造RequestBody RequestBody body = RequestBody.create(MediaType.parse("text/plain;chaset=utf-8"), "輕輕的我走了,\n" + "正如我輕輕的來;\n" + "我輕輕的招手,\n" + "作別西天的雲彩。\n" + "\n" + "那河畔的金柳,\n" + "是夕陽中的新娘;\n" + "波光裡的豔影,\n" + "在我的心頭盪漾。\n); Request request = new Request.Builder().url(Cons.BASE_URL+"PostString").post(body).build(); //3.將Request封裝為Call物件 Call call = okHttpClient.newCall(request); //4.執行Call call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "onFailure: " + e); } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); Log.e(TAG, "onResponse: " + result); runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result)); } }); }

post請求body中加入文字.png
四、通過流傳輸檔案
private void doPostFile() { File file = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera/iv_500x400.png"); //1.獲取OkHttpClient物件 OkHttpClient okHttpClient = new OkHttpClient(); //2.構造Request--任意二進位制流:application/octet-stream Request request = new Request.Builder() .url(Cons.BASE_URL + "PostFile") .post(RequestBody.create(MediaType.parse("application/octet-stream"), file)).build(); //3.將Request封裝為Call物件 Call call = okHttpClient.newCall(request); //4.執行Call call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "onFailure: " + e); } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); Log.e(TAG, "onResponse: " + result); runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result)); } }); }

上傳檔案.png
五、通過模擬表單上傳檔案:MultipartBody
/** * 模擬表單上傳檔案:通過MultipartBody */ private void doUpload() { File file = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera/iv_500x400.png"); RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file); //1.獲取OkHttpClient物件 OkHttpClient okHttpClient = new OkHttpClient(); //2.獲取Request物件 RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", "test.jpg", fileBody) .build(); Request request = new Request.Builder() .url(Cons.BASE_URL + "upload") .post(requestBody).build(); //3.將Request封裝為Call物件 Call call = okHttpClient.newCall(request); //4.執行Call call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "onFailure: " + e); } @Override public void onResponse(Call call, Response response) throws IOException { String result = response.body().string(); Log.e(TAG, "onResponse: " + result); runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result)); } }); }
六、下載檔案:
private void doDownload() { //1.獲取OkHttpClient物件 OkHttpClient okHttpClient = new OkHttpClient(); //2.獲取Request物件 Request request = new Request.Builder().get().url(Cons.BASE_URL + "imgs/test.jpg").build(); //3.將Request封裝為Call物件 Call call = okHttpClient.newCall(request); //4.執行Call call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "onFailure: " + e); } @Override public void onResponse(Call call, Response response) throws IOException { File file = new File(Environment.getExternalStorageDirectory(), "download.jpg"); InputStream is = response.body().byteStream(); FileOutputStream fos = new FileOutputStream(file); byte[] buf = new byte[102]; int len = 0; while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } fos.close(); is.close(); } }); }

下載本地.png
七、在安卓端顯示圖片:
有了流,一切都好辦: response.body().byteStream()
關於Bitmap的預處理等操,這裡就不多說了,有興趣的可見 1-MI-Android多媒體之Bitmap:
private void showImg() { //1.獲取OkHttpClient物件 OkHttpClient okHttpClient = new OkHttpClient(); //2.獲取Request物件 Request request = new Request.Builder().get().url(Cons.BASE_URL + "imgs/test.jpg").build(); //3.將Request封裝為Call物件 Call call = okHttpClient.newCall(request); //4.執行Call call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e(TAG, "onFailure: " + e); } @Override public void onResponse(Call call, Response response) throws IOException { InputStream is = response.body().byteStream(); Bitmap bitmap = BitmapFactory.decodeStream(is); runOnUiThread(()->{ mIdIvShow.setImageBitmap(bitmap); }); } }); }

安卓顯示.png
後記:捷文規範
1.本文成長記錄及勘誤表
專案原始碼 | 日期 | 備註 |
---|---|---|
V0.1--無 | 2018-10-20 | 5--安卓網路程式設計之OKHttp3的使用 |
2.更多關於我
筆名 | 微信 | 愛好 | |
---|---|---|---|
張風捷特烈 | 1981462002 | zdl1994328 | 語言 |
我的github | 我的簡書 | 我的CSDN | 個人網站 |
3.宣告
1----本文由張風捷特烈原創,轉載請註明
2----歡迎廣大程式設計愛好者共同交流
3----個人能力有限,如有不正之處歡迎大家批評指證,必定虛心改正
4----看到這裡,我在此感謝你的喜歡與支援