Android:OkHttp網絡請求框架的使用

目錄

一,OkHttp簡介

二,OkHttp請求處理流程

三,OkHttp環境配置

四,OkHttp的使用

1.get網絡請求

2.post上傳表單數據

3.post上傳json格式數據

4.文件上傳

5.文件下載


一,OkHttp簡介

????????OkHttp是square公司推出的一款Android和Java網絡請求庫,是目前公認的最好用的網絡請求框架,OkHttp有以下的特點:

  1. 支持Http/2,允許對同一主機的所有請求共享同一套接字;
  2. 使用連接池減少請求延時;
  3. 透明的GZIP壓縮減少響應數據的大小;
  4. 緩存響應的內容,避免重復請求;

OkHttp源碼地址:https://github.com/square/okhttp?

二,OkHttp請求處理流程

(1)使用OkHttp需要先創建OkHttpClient對象,可以使用構造器直接創建,也可以使用builder創建;

(2)使用Request.builder創建Request請求,用于封裝要訪問的網絡地址Url。當進行post操作時,還需創建RequestBody用于封裝請求數據,并調用Requst的post方法;

(3)通過OkHttpClient的newCall方法創建Call對象,使用同步或異步的方法發送Request請求,并接收Response響應數據;

三,OkHttp環境配置

(1)在build.gradle中添加依賴:

dependencies {
????????implementation 'com.squareup.okhttp3:okhttp:3.14.9'
}

(2)在AndroidManifest.xml中添加網絡訪問權限:

<uses-permission android:name="android.permission.INTERNET"/>?

(3)在AndroidManifest.xml添加 android:usesCleartextTraffic="true" 解除Http訪問禁制:

四,OkHttp的使用

OkHttp主要有以下功能:

  1. get,post請求文本數據;
  2. 上傳文件;
  3. 下載文件;
  4. 加載圖片(自動壓縮圖片大小);

1.get網絡請求

private void visitInternet() {//1.創建HttpClient對象OkHttpClient okHttpClient = new OkHttpClient();//2.獲取request對象Request.Builder builder = new Request.Builder().url("https://www.bilibili.com/");Request request = builder.build();//3.獲取call對象Call call = okHttpClient.newCall(request);//4.執行網絡操作(同步)try {//同步執行網絡操作Response response = call.execute();String result = response.body().string();showResultOnUiThread(result);} catch (IOException e) {throw new RuntimeException(e);}
}

????????注意這里使用了call的同步請求方式,會產生阻塞,所以此方法必須放在子線程中執行。如果不想放在子線程中執行的話,可以使用call的異步請求方式。

????????當請求成功時call會返回Response,我們可以通過response.body()獲取字符串,輸入流等返回的信息。

2.post上傳表單數據

????????當需要上傳數據時,需要創建RequestBody用于封裝數據,因為我們這里上傳的是表單數據,所以需要創建RequestBody的子類FormBody 。

private void postForm() {OkHttpClient okHttpClient = new OkHttpClient();//創建FormBody對象,封裝數據(鍵值對信息)FormBody formBody = new FormBody.Builder().add("userName", "json").add("pwd", "123456").build();Request request = new Request.Builder().post(formBody).url(Host + "/servlet01").build();Call call = okHttpClient.newCall(request);//異步執行網絡操作call.enqueue(new Callback() {//請求本身失敗時調用@Overridepublic void onFailure(Call call, IOException e) {showResultOnUiThread("請求為空");}//請求成功時調用@Overridepublic void onResponse(Call call, Response response) throws IOException {String result = response.body().string();showResultOnUiThread(result);}});
}

????????當使用call的異步請求方式時,需要重寫兩個方法onFailureonResponse,當請求失敗時(連接失敗或讀寫超時)調用onFailure,請求成功時調用onResponse。

????????可以寫一個簡單的服務端來驗證一下是否可以請求成功:

@WebServlet("/servlet01")
public class servlet01 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");String userName = req.getParameter("userName");String pwd = req.getParameter("pwd");if(userName == null || "".equals(userName)){resp.getWriter().write("用戶名不能為空");}else if(pwd == null || "".equals(pwd)){resp.getWriter().write("密碼不能為空");}else {resp.getWriter().write("歡迎:" + userName);}}
}

3.post上傳json格式數據

????????使用Gson需要先添加依賴:

implementation'com.google.code.gson:gson:2.10.1'

????????當上傳json數據時,自然需要用到RequestBody來封裝json數據,同時還需用MediaType來設置數據類型(也就是我們想要上傳的數據的類型)。

private void postJson() {OkHttpClient okHttpClient = new OkHttpClient();//1.創建json數據User user = new User();user.setUsername("json");user.setPwd("123456");String json = new Gson().toJson(user);//2.通過RequestBody封裝json數據RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"),//設置數據類型json//數據);Request request = new Request.Builder().post(requestBody).url(Host + "/servlet02").build();Call call = okHttpClient.newCall(request);try {Response response = call.execute();String result = response.body().string();showResultOnUiThread(result);} catch (IOException e) {throw new RuntimeException(e);}
}

同樣寫一個簡單服務端來測試一下:

@WebServlet("/servlet02")
public class servlet02 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(req.getInputStream()));String data = bufferedReader.readLine();resp.getWriter().write("json:" + data);}
}

4.文件上傳

????????通過OkHttp上傳文件的步驟與上傳json數據一致,只需更換設置的數據類型即可。因為上傳的需要是安卓客戶端的數據,所以我們需要先在安卓客戶端添加數據。

????????打開路徑data/data/com.example.okhttp/files,在files目錄下添加一張圖片,之后就可以開始上傳了。第一次打開時沒有files這個目錄,需要手動創建。

同時還需要給app添加訪問sd卡的權限,在AndroidManifest.xml中添加:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

客戶端上傳文件:

private void upImg() {//通過文件路徑打開文件String path = getFilesDir().getAbsolutePath() +"/zj.png";File file = new File(path);OkHttpClient okHttpClient = new OkHttpClient();RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"),file);Request request = new Request.Builder().post(requestBody).url(Host + "/servlet02").build();Call call = okHttpClient.newCall(request);try {Response response = call.execute();String result = response.body().string();showResultOnUiThread(result);} catch (IOException e) {throw new RuntimeException(e);}
}

服務端接收文件:

@WebServlet("/servlet02")
public class servlet02 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");File file = new File(filePath);ServletInputStream inputStream = req.getInputStream();FileOutputStream fileOutputStream = new FileOutputStream(file);byte[] bytes = new byte[1024];int len = -1;while((len = inputStream.read(bytes)) != -1){fileOutputStream.write(bytes, 0, len);fileOutputStream.flush();}resp.getWriter().write("上傳成功!");inputStream.close();fileOutputStream.close();}
}

5.文件下載

下載文件時不需要上傳數據,因此不用創建RequestBody對象,只需發送請求即可。

private void downImg() {OkHttpClient okHttpClient = new OkHttpClient();Request request = new Request.Builder().url(Host2 + "/servlet03").build();Call call = okHttpClient.newCall(request);try {Response response = call.execute();//獲取返回的輸入流InputStream inputStream = response.body().byteStream();//轉成bitmap數據Bitmap bitmap = BitmapFactory.decodeStream(inputStream);runOnUiThread(new Runnable() {@Overridepublic void run() {img_img.setImageBitmap(bitmap);}});} catch (IOException e) {throw new RuntimeException(e);}
}

服務端提供數據:

@WebServlet("/servlet03")
public class servlet03 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {File file = new File(filePath);ServletOutputStream outputStream = resp.getOutputStream();BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file));byte[] bytes = new byte[1024];int len = -1;while((len = bufferedInputStream.read(bytes)) != -1){bufferedOutputStream.write(bytes, 0, len);}bufferedOutputStream.close();bufferedInputStream.close();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13533.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13533.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13533.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

npm 源管理工具 nrm

npm 源管理工具 nrm 安裝(可能很慢, 多試幾次) npm install -g nrm查看可選擇源列表 nrm ls切換源 nrm use <registry>如: nrm use taobao

rust的版本問題,安裝問題,下載問題

rust的版本、安裝、下載問題 rust版本問題&#xff0c; 在使用rust的時候&#xff0c;應用rust的包&#xff0c;有時候包的使用和rust版本有關系。 error: failed to run custom build command for pear_codegen v0.1.2 Caused by: process didnt exit successfully: D:\rus…

鴻蒙全面開發指南:入門、生態安全與資源支持

鴻蒙全面開發指南&#xff1a;入門、生態安全與資源支持 本文全面梳理了鴻蒙操作系統的開發入門流程&#xff0c;涵蓋了開發環境準備、工具使用、項目創建、模擬器配置到應用安全設計的各個方面。通過本文&#xff0c;讀者不僅能夠了解鴻蒙開發的基本步驟&#xff0c;也能深入理…

Aspose.PDF功能演示:在 JavaScript 中將 TXT 轉換為 PDF

您是否正在尋找一種在 JavaScript 項目中將純文本文件從TXT無縫轉換為PDF格式的方法&#xff1f;您來對地方了&#xff01;無論您是要構建 Web 應用程序、創建生產力工具&#xff0c;還是只是希望簡化工作流程&#xff0c;直接從 JavaScript 代碼中將 TXT 轉換為 PDF 的功能都可…

第3天 Web源碼拓展_小迪網絡安全筆記

1.關于web源碼目錄結構 #數據庫配置文件 后臺目錄 模板目錄 數據庫目錄 1.1數據庫配置文件: 1.1就拿wordpress來說,先到官網下載源碼:Download – WordPress.org,解壓源碼之后: 2.2找到目錄下名為 wp-config-sample.php的文件,這就是數據庫配置文件: 設想: 我們在滲透…

FOURIER NEURAL OPERATOR FOR PARAMETRIC PARTIAL DIFFERENTIAL EQUATIONS

參數偏微分方程的傅里葉神經算子 論文鏈接&#xff1a;https://arxiv.org/abs/2010.08895 項目鏈接&#xff1a;https://github.com/neuraloperator/neuraloperator 作者博客&#xff1a;https://zongyi-li.github.io/blog/2020/fourier-pde/ 參數偏微分方程的傅里葉神經算子…

本地部署Terraria泰拉瑞亞私服并通過內網穿透生成公網地址遠程聯機

文章目錄 前言1. 下載Terraria私服2. 本地運行Terraria 私服3. 本地Terraria私服連接4. Windwos安裝Cpolar 工具5. 配置Terraria遠程聯機地址6. Terraria私服遠程聯機7. 固定遠程聯機地址8. 固定的聯機地址測試 前言 本文將為你詳細介紹在本地如何運行泰拉瑞亞本地私服和結合C…

認識 React Hooks

回顧函數組件 函數組件 沒有組件實例 不能監聽各個生命周期 無法擴展屬性和方法 沒有 state 和 setState 只是輸入 props &#xff0c;輸出 jsx &#xff0c;純函數。 // class 組件class List extends React.Component {constructor(props) {super(props)}render() {con…

信息泄露--注意點點

目錄 明確目標: 信息泄露: 版本軟件 敏感文件 配置錯誤 url基于文件: url基于路由: 狀態碼: http頭信息泄露 報錯信息泄露 頁面信息泄露 robots.txt敏感信息泄露 .get文件泄露 --判斷: 搜索引擎收錄泄露 BP: 爆破: 明確目標: 失能 讀取 寫入 執行 信息泄…

【文末附gpt升級方案】Ilya離開OpenAI內幕探究:算力削減與商業優先策略的沖突

Ilya離開OpenAI內幕探究&#xff1a;算力削減與商業優先策略的沖突 一、引言 在人工智能&#xff08;AI&#xff09;領域的飛速發展中&#xff0c;OpenAI一直以其領先的技術和創新產品而備受矚目。然而&#xff0c;近日發生的Ilya Sutskever離開OpenAI的事件卻引起了業界的廣…

java企業級云MES系統全套源碼,支持app、小程序、H5、臺后管理

企業級云MES全套源碼&#xff0c;支持app、小程序、H5、臺后管理端 企業級智能制造MES系統源碼&#xff0c;技術架構&#xff1a;springboot vue-element-plus-admin MES指的是制造企業生產過程執行系統&#xff0c;是一套面向制造企業車間執行層的生產信息化管理系統。MES可以…

棧(基于動態順序表實現的棧)

棧的簡單介紹 關于棧的性質咳咳 棧&#xff1a;棧是一種特殊的線性表,其中只讓在一端插入和刪除元素。 后進先出 進行插入刪除的那一端叫棧頂&#xff0c;另一端叫棧底 我們實現的棧是基于一個動態順序表的的棧&#xff0c;會實現棧的 入棧&#xff0c;出棧&#xff0c;獲取…

修改默認時區,默認語言,默認國家

確認時區&#xff0c;語言&#xff0c;國家 build/make/target/product/languages_default.mkframeworks/base/packages/SettingsLib/res/xml/timezones.xml設備mk中添加相關內容 PRODUCT_PROPERTY_OVERRIDES \persist.sys.timezoneEurope/AmsterdamPRODUCT_PROPERTY_OVERRI…

嵌入式學習——3——超時timeout

1、自帶超時參數的函數 select自帶超時 定義超時時間變量 struct timeval tv {5, 0}; while(1) { tv.tv_sec 5; tv.tv_usec 0; int res select(1, &readfds, NULL, NULL, &tv); ..... } poll自帶超時 1、poll函數的第三個參數&#xff0c;是以毫秒為單位的超時時間…

前端vue用el-table如何實現表頭內容過長換行處理,實現換行效果

前端vue用el-table如何實現表頭內容過長換行處理&#xff0c;實現換行效果 這是效果圖 有兩種方法&#xff0c;一種簡易版本&#xff0c;一種萬能方法,都是el-table&#xff0c;先看文檔 表頭標題是可以自定義的 方法一 label的解釋寫在代碼里面了&#xff0c;這里會自動形成換…

Python概述

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 了解Python Python&#xff0c;本義是指“蟒蛇”。1989年&#xff0c;荷蘭人Guido van Rossum發明了一種面向對象的解釋型高級編程語言&#xff0c;…

利用神經網絡學習語言(六)——總結與常見面試問題

相關說明 這篇文章的大部分內容參考自我的新書《解構大語言模型&#xff1a;從線性回歸到通用人工智能》&#xff0c;歡迎有興趣的讀者多多支持。 文章列表&#xff1a; 利用神經網絡學習語言&#xff08;一&#xff09;——自然語言處理的基本要素利用神經網絡學習語言&…

Java基礎入門day49

day49 tomcat 啟動 進入tomcat的bin目錄&#xff0c;雙擊或者運行startup.bat文件啟動tomcat 控制臺最后出現服務器啟動在多少毫米之內&#xff0c;代表服務器成功啟動 org.apache.catalina.startup.Catalina.start Server startup in 405 ms 驗證tomcat 在瀏覽器中輸入 loca…

一次性計時器

Name: 一次性計時器 Copyright:No Author: 袁神派蒙 Date: 22/05/24 20:40 Description: 一次性的計時器&#xff08;by 袁神派蒙&#xff09; 直接上代碼&#xff1a; /*Name: 一次性計時器 Copyright:No Author: 袁神派蒙Date: 22/05/24 20:40Description: 一次性的計時器…

[算法] 優先算法(二): 雙指針算法(下)

&#x1f338;個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;?熱門專欄:&#x1f355; Collection與數據結構 (91平均質量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …