Retrofit類型安全的HTTP客戶端庫(json)

簡介

????????Retrofit是Square公司開發的一個類型安全的HTTP客戶端庫,用于Android和Java平臺,它使得與Web服務的交互變得更加簡單快捷。Retrofit將HTTP API轉換成Java接口,讓你可以用更簡潔的代碼形式調用RESTful API,Android網絡編程重點之一,基于互聯網,從服務器上獲取數據。

一、添加依賴(資源包)

需要添加的依賴:

com.squareup.retrofit2:retrofit:2.x.y
com.squareup.okhttp3:okhttp:4.9.1
com.squareup.retrofit2:converter-scalars:2.x.y
com.squareup.retrofit2:converter-gson:2.x.y
org.jsoup:jsoup:1.17.2

首先,在你的build.gradle.kts(Module級別)文件中添加Retrofit的依賴:

在versions中添加名稱及版本

retrofit = "2.9.0"
gson="2.9.0"

在libraries中添加到相應的地址,包名,配置管理

retrofit = {group = "com.squareup.retrofit2", name ="retrofit",version.ref = "retrofit"}
gson={group="com.squareup.retrofit2",name="converter-gson",version.ref="gson"}

最后在"dependencies"(依賴關系)中添加上文中的名稱

implementation(libs.retrofit)implementation(libs.gson)

二、定義API接口

創建一個接口來描述Web服務的端點。Retrofit會根據這個接口生成實現類。

原理:

public interface ApiService {@GET("users/{user}/repos")Call<List<Repo>> listRepos(@Path("user") String user);
}

實例:

public interface WHttp {@GET("api/weather/city/{id}")Call<ReSon> getCall(@Path("id") String id);
}

創建 Retrofit 實例

????????創建一個接口來描述Web服務的端點。Retrofit會根據這個接口生成實現類。

Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()) // 如果你使用Gson解析JSON.client(new OkHttpClient()).build();

這里,@GET注解指定了HTTP的GET方法,{user}是一個動態部分,將由@Path注解的參數填充。

三、創建服務接口的實例

創建實例:

使用Retrofit實例來創建API接口的實例,并用gson中的addConverterFactory()方法解析數據

四、發送請求:

創建Retrofit服務接口實例

WHttp wHttp = retrofit.create(WHttp.class);

這一行代碼通過Retrofit實例創建了一個名為WHttp的服務接口實現。WHttp接口應該事先定義好,包含了一些用于定義HTTP請求的方法,比如這里的getCall方法。

構建請求

Call<ReSon> call = wHttp.getCall("101260101");

調用WHttp接口中的getCall方法,并傳入參數"101260101"(這個參數根據實際接口需求可能代表某種ID或查詢條件)。這個操作返回一個類型為Call<ReSon>的對象,表示一個即將發出的HTTP請求,目的是獲取一個ReSon類型的響應數據。

異步執行請求enqueue

call.enqueue(new Callback<ReSon>() {//...
});

使用enqueue方法異步發送請求。它不會阻塞當前線程,適合在主線程中調用,避免UI凍結。

onResponse
@Override
public void onResponse(Call<ReSon> call, Response<ReSon> response) {ReSon reSon = (ReSon) response.body();textView.setText(reSon.getDate());
}

????????當請求成功完成并且服務器返回一個成功的響應(HTTP狀態碼在200-299之間)時,onResponse方法會被調用。通過response.body()獲取到服務器返回的ReSon對象,然后從中提取數據(這里假設ReSon類有一個getDate方法用于獲取日期信息),并將這個信息設置到一個名為textView的TextView控件中顯示。

onFailure
@Override
public void onFailure(Call<ReSon> call, Throwable t) {textView.setText("錯誤" + t);
}

????????如果請求過程中出現錯誤,比如網絡問題、超時、服務器無響應等,onFailure方法會被觸發。這里簡單地將錯誤信息以文本形式顯示在textView中,實際應用中可能需要更細致的錯誤處理,比如根據錯誤類型給出不同的提示信息,或者進行重試邏輯等。

總的來說,這段代碼演示了如何使用Retrofit發送一個異步HTTP請求,處理成功響應和失敗情況的基本模式。

五、最總代碼:

WHttp wHttp = retrofit.create(WHttp.class);Call<ReSon> call = wHttp.getCall("101260101");call.enqueue(new Callback<ReSon>() {@Overridepublic void onResponse(Call<ReSon> call, Response<ReSon> response) {ReSon reSon =  response.body();textView.setText(reSon.getDate());}@Overridepublic void onFailure(Call<ReSon> call, Throwable t) {textView.setText("錯誤"+t);}});

六、網絡安全錯誤

????????該錯誤信息表明您的應用程序嘗試與域名t.weather.itboy.net建立網絡連接時,被網絡安全策略阻止了。這通常是因為現代操作系統和網絡框架為了提高安全性,會限制明文(未加密)的HTTP通信,鼓勵或強制使用HTTPS進行加密通信。

?????????解決這個問題的方法通常涉及到更新應用的網絡安全配置,允許特定域名的明文流量或者最好是確保所有通信都通過HTTPS進行。如果你的應用是運行在Android平臺上,可以通過以下步驟解決:

創建網絡安全配置文件

????????????????在你的Android項目的res/xml目錄下,創建一個名為network_security_config.xml的文件(如果該目錄不存在,請先創建它),并添加如下配置以允許特定域名的明文流量(t.weather.itboy.net)(這不推薦用于生產環境,僅作示例):

1<?xml version="1.0" encoding="utf-8"?>
2<network-security-config>
3    <domain-config cleartextTrafficPermitted="true">
4        <domain includeSubdomains="true">t.weather.itboy.net</domain>
5    </domain-config>
6</network-security-config>
  1. 引用配置文件

    1. 在你的應用的AndroidManifest.xml文件中,添加android:networkSecurityConfig屬性指向剛才創建的配置文件:Xml
      1<application
      2    ...
      3    android:networkSecurityConfig="@xml/network_security_config">
      4    ...
      5</application>
  2. 重啟應用

    1. 保存更改后,重新編譯并安裝你的應用到設備上。

然而,最安全的做法是確保t.weather.itboy.net支持HTTPS,并且你的應用只通過HTTPS與之通信。如果該服務確實提供了HTTPS連接,請檢查你的應用程序代碼,確保所有URL都以https://開頭而非http://

如果這是由于Android系統的安全策略(比如在Android 9及以上版本中對明文流量的限制),則上述解決方案是必要的。但在實施時,始終優先考慮應用和用戶數據的安全性。

?數據匹配錯誤

如下錯誤:

更正數據匹配為:

七、效果

八、異步與同步請求

????????Retrofit支持異步(如上所示使用enqueue方法)和同步請求(使用execute方法)。注意,同步請求不應該在主線程中執行,因為它會阻塞UI線程。在Retrofit中,異步請求通過enqueue方法實現,而同步請求則通過execute方法完成。下面分別給出這兩個操作的示例代碼,但請注意,同步請求應當避免在Android主線程中直接執行,以免阻塞UI,導致應用無響應(ANR)。

異步請求示例(已提供,再次展示以供參考)

1WHttp wHttp = retrofit.create(WHttp.class);
2Call<ReSon> call = wHttp.getCall("101260101");
3
4call.enqueue(new Callback<ReSon>() {
5    @Override
6    public void onResponse(Call<ReSon> call, Response<ReSon> response) {
7        if (response.isSuccessful()) {
8            ReSon reSon = response.body();
9            // 在這里處理響應數據,例如更新UI
10            runOnUiThread(new Runnable() {
11                @Override
12                public void run() {
13                    textView.setText(reSon.getDate());
14                }
15            });
16        } else {
17            // 處理錯誤情況,例如HTTP錯誤碼
18        }
19    }
20
21    @Override
22    public void onFailure(Call<ReSon> call, Throwable t) {
23        // 處理網絡請求失敗的情況
24        runOnUiThread(new Runnable() {
25            @Override
26            public void run() {
27                textView.setText("錯誤: " + t.getMessage());
28            }
29        });
30    }
31});

同步請求示例

同步請求應當在后臺線程執行,例如使用ThreadAsyncTask(盡管AsyncTask在Android 11及以上版本已被廢棄,推薦使用其他并發機制如java.util.concurrent包下的工具類)。以下使用一個簡單的Thread示例:

1new Thread(new Runnable() {
2    @Override
3    public void run() {
4        try {
5            WHttp wHttp = retrofit.create(WHttp.class);
6            Call<ReSon> call = wHttp.getCall("101260101");
7            Response<ReSon> response = call.execute();
8
9            if (response.isSuccessful()) {
10                final ReSon reSon = response.body();
11                // 由于不能直接在后臺線程更新UI,需要切換到主線程
12                runOnUiThread(new Runnable() {
13                    @Override
14                    public void run() {
15                        textView.setText(reSon.getDate());
16                    }
17                });
18            } else {
19                // 錯誤處理,同樣需要回到主線程更新UI
20                runOnUiThread(new Runnable() {
21                    @Override
22                    public void run() {
23                        textView.setText("同步請求錯誤: " + response.code());
24                    }
25                });
26            }
27        } catch (IOException e) {
28            e.printStackTrace();
29            // 異常處理,同樣需要回到主線程更新UI
30            runOnUiThread(new Runnable() {
31                @Override
32                public void run() {
33                    textView.setText("同步請求失敗: " + e.getMessage());
34                }
35            });
36        }
37    }
38}).start();

在上述同步請求示例中,我們通過創建一個新的Thread并在其中執行execute方法來發送請求。由于execute會阻塞直到請求完成,所以它不能直接在主線程中使用。請求完成后,我們使用runOnUiThread回調到主線程更新UI,以確保遵循Android的單線程模型。

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

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

相關文章

在前端開發過程中如果函數參數很多,該如何精簡

1. 在前端開發過程中如果函數參數很多&#xff0c;該如何精簡 1.1. 對象參數&#xff08;對象字面量&#xff09;&#xff1a;1.2. 默認參數和解構賦值&#xff1a;1.3. 使用類或構造函數&#xff1a;1.4. 利用閉包或者高階函數&#xff1a;1.5. 利用ES6的擴展運算符&#xff1…

【LeetCode】每日一題:反轉鏈表

題解思路 循環的方法需要注意prev應該是None開始&#xff0c;然后到結束的時候prev是tail&#xff0c;遞歸的思路很難繞過彎來&#xff0c;主要在于很難想清楚為什么可以返回尾節點&#xff0c;需要多做遞歸題&#xff0c;以及遞歸過程中&#xff0c;可以不使用尾節點來找當前…

Nuxt3 的生命周期和鉤子函數(二)

title: Nuxt3 的生命周期和鉤子函數&#xff08;二&#xff09; date: 2024/6/26 updated: 2024/6/26 author: cmdragon excerpt: 摘要&#xff1a;本文深入介紹了Nuxt.js框架中幾個關鍵的生命周期鉤子函數&#xff0c;包括app:redirected&#xff08;SSR環境下重定向前觸發…

20240626讓飛凌的OK3588-C開發板在相機使用1080p60分辨率下預覽

20240626讓飛凌的OK3588-C開發板在相機使用1080p60分辨率下預覽 2024/6/26 15:15 4.2.1 全編譯測試 在源碼路徑內&#xff0c;提供了編譯腳本 build.sh&#xff0c;運行該腳本對整個源碼進行編譯&#xff0c;需要在終端切換到解壓 出來的源碼路徑&#xff0c;找到 build.sh 文件…

6.26作業

1.整理思維導圖 2.統計家目錄下.c文件的個數 ls ~/*.c | wc -l 3.終端輸入一個.sh文件&#xff0c;判斷文件是否由可執行權限&#xff0c;如果有可執行權限運行腳本&#xff0c;沒有可執行權限添加可執行權限后&#xff0c;再運行腳本 #!/bin/bash read -p "請輸入一個.…

spring模塊(二)SpringBean(2)InitializingBean

一、介紹 InitializingBean是Spring框架提供的一個接口&#xff0c;用于在Bean初始化完成后執行特定的初始化邏輯。 二、使用 1、使用方法 1.1、實現InitializingBean接口 可以讓Bean實現該接口&#xff0c;并重寫其afterPropertiesSet()方法 1.2、注冊 也即讓bean初始化…

從官方源碼精簡出第1個FreeRTOS程序

一、下載官方源碼 1、打開百度搜索freerots&#xff0c;找到官網:FreeRTOS官網 2、將源碼解壓到沒有中文目錄的路徑下 二、刪減目錄 1、刪除FreeRTOS-Plus和tools 2、刪除FreeRTOS/Demo下除CORTEX_STM32F103_Keil外的所有文件 3、刪除FreeRTOS\Source\portable下除RVDS和MemM…

vue2面試題——API

1. $set this.$set(目標對象target&#xff0c;改的位置&#xff0c;最終數據) /* 數據更新了而視圖沒有更新的情況 */ <template><div>{{ arr }}<button clickbtn>按鈕</button></div> </template> <script> export default {name:…

海康威視攝像頭修復

一、適用場景 1、室外安裝的攝像頭&#xff0c;長時間日曬雨淋后&#xff0c;可能因風向導致雨水進入水晶頭&#xff0c;進而攝像頭無法識別&#xff1b; 2、在經常施工的場地&#xff0c;可能由于車輛的進出&#xff0c;或施工設備的運行導致攝像頭的網線水晶頭斷裂而無法使用…

潯川社團正式啟用 代碼付費制度——潯川總社部

潯川社團正式啟用 代碼付費制度。 規則&#xff1a; 潯川社團源代碼收費標準表&#xff08;1&#xff09; 1-5行代碼0.2元/行1-10行代碼0.3元/行1-20行代碼0.5元/行 潯川社團源代碼收費標準表&#xff08;2&#xff09; 1-30行代碼0.6元/行1-40行代碼0.8元/行1-50行代碼0.09元…

【PythonWeb開發】Flask中間件鉤子函數實現封IP

在 Flask 框架中&#xff0c; 提供了幾種類型的鉤子&#xff08;類似于Django的中間件&#xff09;&#xff0c;它們是在請求的不同階段自動調用的函數。這些鉤子讓你能夠對請求和響應的處理流程進行擴展&#xff0c;而無需修改核心代碼。 Flask鉤子的四種類型 before_first_r…

IT入門知識第八部分《云計算》(8/10)

目錄 云計算&#xff1a;現代技術的新篇章 1. 云計算基礎 1.1 云計算的起源和發展 云計算的早期概念 云計算的發展歷程 1.2 云計算的核心特點 按需自助服務 廣泛的網絡訪問 資源池化 快速彈性 按使用量付費 1.3 云計算的優勢和挑戰 成本效益 靈活性和可擴展性 維…

[leetcode]intersection-of-two-arrays-ii 兩個數組的交集 II

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());int length1 nums1.size(), length2 …

動態規劃——123. 買賣股票的最佳時機 III

目錄 1、題目鏈接 2、題目分析 1.狀態表示 2.狀態轉移方程 3.初始化 4.填表 5.返回值 3、代碼解析 1、題目鏈接 123. 買賣股票的最佳時機 III 2、題目分析 1.狀態表示 由題目可知&#xff0c;我們分為兩種狀態&#xff0c;買入和賣出&#xff0c;又因為只能完成兩次交易…

windows下如何配置vs code的編譯環境

在 Windows 上配置 VS Code 的編譯環境涉及安裝編譯器、配置 VS Code 以及編寫和運行代碼。以下是具體的步驟&#xff1a; 步驟 1&#xff1a;安裝必要的軟件 安裝 Visual Studio Code&#xff1a; 訪問 VS Code 的官方網站并下載安裝包。按照安裝向導進行安裝。 安裝 C/C 編譯…

盲源信道分離—FastICA算法性能仿真

本案例中使用Matlab軟件對FastICA算法的聲音分離性能進行了仿真&#xff0c;分別對簡單波形的混合信號、不同類型聲音的混合信號、同一類型的混合信號這三種情況進行仿真&#xff0c;主要從分離信號的波形形狀、串音誤差兩方面對分離性能進行衡量&#xff0c;仿真結果顯示快速I…

Gradle學習-3 Gradle構建的生命周期

Gradle常用文件目錄 Gradle 構建的生命周期&#xff0c;有3個階段: 初始化階段配置階段執行階段 1、初始化階段 Gradle 支持構建單個工程個多個子工程&#xff0c;初始化階段主要負責收集所有參與本次構建的子工程&#xff0c;創建一個項目的層次結構&#xff0c;并未每個…

SpringBoot優點達項目實戰:獲取系統配置接口(三)

SpringBoot優點達項目實戰&#xff1a;獲取系統配置接口&#xff08;二&#xff09; 文章目錄 SpringBoot優點達項目實戰&#xff1a;獲取系統配置接口&#xff08;二&#xff09;1、查看接口2、查看數據庫3、代碼實現1、創建實體類SysConfig2、創建返回數據的vo3、創建control…

【INTEL(ALTERA)】Eclipse Nios II SBT 無法從模板創建新應用程序和 BSP

目錄 說明 解決方法 說明 您應該能夠創建新的應用程序和 BSP 模板包含以下步驟&#xff1a; 選擇 Nios II應用程序和 BSP 來自模板。選擇您的.sopcinfo 文件并選擇模板。從您的工作區單擊 選擇現有的 BSP 項目。單擊 創建。選擇所需的 BSP 選項。單擊 完成。 但是&#xf…

API 安全策略和基礎指南

API 是當今數字創新計劃的核心&#xff0c;已成為應用程序的頭號攻擊載體。了解什么是 API 安全、為什么它如此重要&#xff0c;以及如何保護您的 API 免受現代威脅至關重要。 什么是 API 安全&#xff1f; 應用程序編程接口&#xff08;API&#xff09;是現代應用程序的基石…