【Android】OkHttp發起GET請求 POST請求

在這里插入圖片描述
三三要成為安卓糕手

一:OkHttp介紹

OkHttp 是一個開源的、強大且高效的 HTTP 客戶端庫,主要用于在 Java后端和Android 項目中進行網絡請求。

//在gradle中添加依賴
com.squareup.okhttp3:okhttp:4.12.0

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

二:GET請求

  /*** 使用OkHttp發起get請求*/private void  sendGetRequest(){String id = etUserId.getText().toString();String urlAddress = "http://titok.fzqq.fun/addons/cms/api.user/userInfo?user_id=" + id + "&type=archives";//創建OkHttpClient實例對象,用于發起請求OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10,TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build();//設置請求屬性,比如地址,方法屬性Request request = new Request.Builder().url(urlAddress).get().build();//發起單個請求Call call = okHttpClient.newCall(request);//接收響應Callback callback = new Callback() {@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {runOnUiThread(new Runnable() {@Overridepublic void run() {if(response.isSuccessful()){//響應成功try {String result = response.body().string();Log.i(TAG, "run: result" + result);//把json字符串轉化為對象UserInfoQuery userInfoQuery = new Gson().fromJson(result, UserInfoQuery.class);String msg = "當前的用戶名是:" + userInfoQuery.getData().getUser().getNickname();Toast.makeText(OkHttpActivity.this,msg,Toast.LENGTH_SHORT).show();} catch (IOException e) {throw new RuntimeException(e);}}else{Toast.makeText(OkHttpActivity.this,"網絡請求失敗"+response.code(),Toast.LENGTH_SHORT).show();}}});}@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(OkHttpActivity.this,"網絡請求失敗",Toast.LENGTH_SHORT).show();}});}};call.enqueue(callback);}

1:大致步驟

  • 使用builder去創建OkHttpClient實例對象,設置一些連接的屬性:常見連接超時,數據讀取超時
  • 使用builder設置請求屬性:常見url,get方法
  • 調用newCall發起單次請求,傳入request參數,使用enqueue異步線程
  • new Callback();重寫接口中的onResponse方法和onFailure方法
  • 方法中的內部邏輯,對于ui的處理要在主線程中進行,調用runOnUiThread(new Runnable接口,重寫run方法)

2:一些細節

  • 我們一般不會直接new一個request,而是選擇一個底下的一個builder的東西

(1)內部回調接口

在 OkHttp 中,call.enqueue(callback) 并非 “把響應丟進 call 里”,而是通過回調機制實現異步請求的結果處理

  • Call 對象是對一個 HTTP 請求的封裝,調用 enqueue(callback) 時,其實是向Call 注冊了一個回調接口
  • OkHttp 會在后臺線程執行網絡請求,當請求完成(成功或失敗)后,會自動調用onResponseonFailure方法,并將響應結果(Response 對象)作為參數傳入。

(2)次線程轉主線程

接口中重寫的onResponse方法和onFailure方法內部的代碼,涉及到UI應該要回到主線程中去進行

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

回到主線程去完成ui(彈窗操作)

(3)enqueue方法的說明

“enqueue” 把…… 加入隊列

在 Java 中,enqueue 方法的簽名是 void enqueue(Callback responseCallback) ,它接收一個 Callback 類型的參數,Callback 是 OkHttp 中定義的一個接口,包含兩個抽象方法:

  • onResponse(Call call, Response response):當 HTTP 請求成功完成,且服務器返回了響應時,該方法會被調用,response 參數包含了從服務器獲取到的響應信息,比如響應碼、響應頭、響應體等;call 參數則是當前正在處理結果的這個請求對應的 Call 對象。
  • onFailure(Call call, IOException e):當請求執行過程中發生錯誤,比如網絡連接失敗、超時等情況,這個方法會被調用。

(4)response.body().string()

主要作用是將 ResponseBody 的內容以字符串形式讀取出來。

它會根據響應體的編碼(Content-Type ),把響應體中的字節數據解碼為字符串。并非用toString方法

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

(5)toString () 方法

默認的 toString() 方法返回的是 ResponseBody 類的名稱以及對象的哈希碼等信息,而不是響應體中的實際內容

例如:可能返回類似 okhttp3.ResponseBody@12345678 這樣的字符串,其中 okhttp3.ResponseBody 是類名,@12345678 是對象的哈希碼表示 。

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

(6)TimeUnit 時間單位

在設置超時方面,可以用安卓內部定義好的時間的單位常量

3:效果

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

三:POST請求

/*** POST請求*/private void sendPostRequest(){String loginUrl = "http://titok.fzqq.fun/addons/cms/api.login/login";OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10,TimeUnit.SECONDS).readTimeout(30,TimeUnit.SECONDS).build();String account = etUserName.getText().toString();String password = etPassword.getText().toString();//用Gson去拼接一個請求體String jsonBody = new Gson().toJson(new ReqLogin(account, password));//請求體的數據格式是Json,編碼格式是utf-8MediaType mediaType = MediaType.get("application/json;charset=utf-8");RequestBody requestBody = RequestBody.create(jsonBody, mediaType);//構建請求Request request = new Request.Builder().url(loginUrl).post(requestBody).build();//發起請求Call call = okHttpClient.newCall(request);Callback callback = new Callback() {@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {runOnUiThread(new Runnable() {@Overridepublic void run() {if(response.isSuccessful()){try {String json = response.body().string();Log.i(TAG, "run: " + json);//把json數據轉化為對象,獲取其中的屬性ResLogin resLogin = new Gson().fromJson(json, ResLogin.class);String msg = resLogin.getMsg();int userId = resLogin.getData().getUser_id();Toast.makeText(OkHttpActivity.this,msg + ".歡迎用戶" + userId, Toast.LENGTH_SHORT).show();} catch (IOException e) {throw new RuntimeException(e);}}else {Toast.makeText(OkHttpActivity.this,"登錄失敗",Toast.LENGTH_SHORT).show();}}});}@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(OkHttpActivity.this,"POST登錄請求失敗",Toast.LENGTH_SHORT).show();}});}};call.enqueue(callback);}

1:流程

  • 設置連接屬性
  • ui上獲取數據,Gson.toJson拼接字符串請求體
  • 設置請求體數據格式
  • 構建請求
  • 發起請求
  • 處理響應

2:一些細節

(1) 設計body參數

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

(2)MediaType.get(“application/json;charset=utf-8”);

媒體類型

用于定義請求體或響應體的數據格式和編碼方式,是處理 JSON 數據時的常見用法。

3:登錄效果

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

四:快捷生成JSON對應的對象

商業場景中是會創建一個實體類對象的;而非進行字符串拼接

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

//先用日志獲取json體
String json = response.body().string();
Log.i(TAG, "run: " + json);//在依據日志生成java對象,通過對象去獲取其中的屬性
new Gson().fromJson(json, ResLogin.class)

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

package com.xlong.networkbyjavaproject.bean;public class ResLogin {/*** code : 1* msg : 登錄成功* time : 1756263107* data : {"token":"6c45ff48-c7ef-4666-918e-26dabb214746","user_id":4}*/private int code;private String msg;private String time;private DataBean data;public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public DataBean getData() {return data;}public void setData(DataBean data) {this.data = data;}public static class DataBean {/*** token : 6c45ff48-c7ef-4666-918e-26dabb214746* user_id : 4*/private String token;private int user_id;public String getToken() {return token;}public void setToken(String token) {this.token = token;}public int getUser_id() {return user_id;}public void setUser_id(int user_id) {this.user_id = user_id;}}
}

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

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

相關文章

[Mysql數據庫] 知識點總結8

1. 請詳細描述在復制拓撲中參與復制的線程類型以及各自所承擔的功能。答:當從屬服務器連接到主服務器時,在主服務器上會創建 Binlog 轉儲線程,在從屬服務器上會默 認創建 I/O 線程和 SQL 線程。- Binlog 轉儲線程用于從二進制日志讀取事件并將…

250829-Gitlab數據備份與恢復

下面給你一份可落地的遷移方案,保證 GitLab 的數據和配置完整遷移到服務器 B。你當前用的是 GitLab Omnibus(docker 版),數據都在你映射的 3 個目錄里(/etc/gitlab, /var/log/gitlab, /var/opt/gitlab)&…

吳恩達機器學習作業十一:異常檢測

數據集在作業一異常檢測異常檢測就是發現與大部分對象不同的對象,其實就是發現離群點。異常檢測有時也稱偏差檢測。異常對象是相對罕見的。用數據集建立概率模型p ( x ),如果新的測試數據在這個模型上小于某個閾值,則說它極大可能為異常點算法…

2000w 的數據量,mysql要進行幾次IO操作,為什么

在 MySQL 中,2000 萬數據量的表在進行查詢時所需的 ??IO 操作次數??主要取決于 ??索引結構(B樹層級)??、??查詢類型??和 ??數據分布特征??。以下是具體分析:一、B樹層級與 IO 次數的關系InnoDB 引擎通過 B樹索引管…

【代碼隨想錄day 22】 力扣 39. 組合總和

視頻講解:https://www.bilibili.com/video/BV1KT4y1M7HJ/?vd_sourcea935eaede74a204ec74fd041b917810c 文檔講解:https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html#%E6%80%9D%E8%B7%AF 力扣題目:https://leetcod…

DrissionPage 實戰:動態 IP 代理與百度翻譯 API 數據抓取

本文將詳細介紹如何使用 DrissionPage 實現動態 IP 代理訪問,并結合百度翻譯 API 進行數據抓取與處理。一、技術選型與架構設計1.1 為什么選擇 DrissionPage?DrissionPage 作為新一代網絡自動化工具,相比傳統 Selenium Requests 方案具有顯著…

策略模式:靈活應對算法動態切換

引言 在軟件開發中,我們常常會遇到需要在運行時動態選擇和切換算法或行為的場景。例如,電商系統中的多種支付方式、游戲中的不同難度設置,或是計算器中的各種運算符。傳統的方法可能會使用復雜的條件判斷語句(如if-else或switch-c…

【C++ 】string類:深拷貝與淺拷貝解析

【C 】string類操作全解析-CSDN博客 1.stirng類的模擬實現 1.1 經典的string類問題 上面已經對string類進行了簡單的介紹,大家只要能夠正常使用即可。在面試中,面試官總喜歡要求自己來模擬實現string類,最主要是實現string類的構造、拷貝…

Decoder 解碼器

Decoder 解碼器&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>#include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libswscale/swscale.h>#define WORD uint16_t #define DWORD ui…

globals() 小技巧

scheduler_class globals()[scheduler_class_name] Python 中一種 動態獲取類對象 的常用技巧&#xff0c;屬于 反射&#xff08;reflection&#xff09; 編程的范疇globals()Python 內置函數&#xff0c;返回一個 字典&#xff08;dict&#xff09;&#xff0c;包含當前模塊&…

Android Studio 9.png制作

一、新建 二、把要做的圖png導入進去 png圖片建議 根據內容預留1像素可拉伸區域 eg:純色或可漸變底色 三、右邊創建.9.png 四、雙擊打開 1、繪制黑邊 參考視頻 2、縮放到800% ,移至右下 3、在下面和右邊繪制整根黑線 4、根據png 位置左側和上側黑線 4.1 分析 紅色方框為…

【百度】C++開發(25屆提前批 一面)面經

文章目錄1. 代碼實現&#xff1a;說說LRU&#xff0c;并代碼實現LRU為什么使用哈希表&#xff1f;&#xff08;有兩個原因&#xff09;1. 僅用雙向鏈表的缺陷2. 引入哈希表的作用1. 快速查找&#xff1a;2. 快速插入與刪除&#xff1a;雙向鏈表 哈希表的協作過程舉例說明代碼實…

Word文檔怎么打印?Word打印技巧?【圖文詳解】單面/雙面/指定頁面/逆序等Word打印選項

一、問題背景 在日常辦公、學習場景中&#xff0c;Word文檔作為常用的文字處理載體&#xff0c;經常需要將電子內容轉化為紙質版本&#xff0c;比如提交報告、打印學習資料、整理文檔存檔等。 但不少用戶在嘗試打印Word文檔時&#xff0c;常會遇到各種阻礙&#xff1a;有的不清…

漫談《數字圖像處理》之基函數與基圖像

在數字圖像處理領域&#xff0c;基函數與基圖像是貫穿理論分析與實際應用的核心概念 —— 它們如同 “樂高積木”&#xff0c;將復雜的圖像信號拆解為可解釋、可操作的基本單元&#xff0c;支撐起壓縮、去噪、特征提取等一系列關鍵任務。從傳統的傅里葉變換到前沿的因子場理論&…

打開多個Excel文件后快速關閉所有的文檔,并且退出Excel應用

打開多個Excel文件后如果要快速關閉所有的文檔&#xff0c;并且退出Excel應用&#xff0c;可以按住Shift鍵右上角的號&#xff08;關閉按鈕&#xff09;。Word和PowerPoint也是一樣的操作。如果有文檔修改后沒有保存&#xff0c;會提示是否保存。作為補充&#xff0c;先來看看兩…

基于 PyTorch 構建 Dataset 與 DataLoader:從 TXT 文件讀取到新增類別全流程指南

基于 PyTorch 構建 Dataset 與 DataLoader&#xff1a;從 TXT 文件讀取到新增類別全流程指南在深度學習計算機視覺任務中&#xff0c;數據加載與預處理是模型訓練的基礎環節&#xff0c;直接影響模型的訓練效率與最終性能。PyTorch 作為主流深度學習框架&#xff0c;提供了Data…

hive on tez如果是2個大表union會寫幾次臨時文件到hdfs目錄,數據量如何計算

如果是2個大表union會寫幾次臨時文件到hdfs目錄&#xff0c;數據量如何計算 在Hive on Tez中&#xff0c;兩個大表執行UNION操作時&#xff0c;臨時文件的寫入次數和數據量&#xff0c;取決于UNION的類型&#xff08;UNION ALL還是UNION去重&#xff09;以及執行計劃的Stage劃分…

Web+js轉uni-app+ts

一、入手uni-app 官方文檔&#xff1a;uni-app官網 1.創建uni-app項目 1.1通過HBuilderX進行創建 官方地址&#xff1a;HBuilderX-高效極客技巧 1.2通過命令行創建 // js 版本的 npx degit dcloudio/uni-preset-vue#vite 項目名 npx degit dcloudio/uni-preset-vue#vite-…

IO_hw_8.29

1.使用fgets和fputs完成兩個文件的拷貝&#xff0c;要求文件名使用外部傳承2.注冊登錄代碼3.思維導圖4.牛客網刷題記錄

數據結構(04)—— 棧和隊列

Hi&#xff01;探索者們&#x1f609;&#xff0c;歡迎踏入 408 數據結構的奇妙秘境&#x1f33f;&#xff01;? 我是 ankleless&#x1f4da;&#xff0c;和你并肩的尋寶人&#xff5e; 這是我的探險手札&#x1f5fa;?&#xff0c;里面記著鏈表森林的岔路陷阱&#x1f578;…