Android 網路框架 Retrofit

来源:https://www.cnblogs.com/94xiyang/archive/2018/09/11/9629205.html
-Advertisement-
Play Games

概述 Retrofit是一個OkHttp網路請求框架的封裝庫,Retrofit通過註解配置網路參數,可以按照我們的規則去構造實際的HTTP請求,能夠靈活設置URL、頭部、請求體、返回值等,是目前最優雅的一個網路框架。 引入 Retrofit基本使用三部曲 創建實例 定義介面 創建 同步/非同步 回調 ...


概述

Retrofit是一個OkHttp網路請求框架的封裝庫,Retrofit通過註解配置網路參數,可以按照我們的規則去構造實際的HTTP請求,能夠靈活設置URL、頭部、請求體、返回值等,是目前最優雅的一個網路框架。

引入

implementation 'com.squareup.retrofit2:retrofit:2.2.0'

implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'//添加對RxJava的支持
implementation 'com.squareup.retrofit2:converter-gson:2.1.0' //添加Json數據的支持

<uses-permission android:name="android.permission.INTERNET"/>//網路請求必要的許可權

Retrofit基本使用三部曲

創建實例

 Retrofit retrofit = new Retrofit.Builder()
          .baseUrl("http://id1.option****.cc:***1/")//Retrofit2 的baseUlr 必須以 /(斜線) 結束
          .build();
RetrofitService service = retrofit.create(RetrofitService.class);//創建介面的代理對象

定義介面

public interface RetrofitService {
    
    @GET("/pursuit/getPursuitInfo")
    Call<ResponseBody> getBlog(@Query("id") int id);

    @GET("/pursuit/getPursuitInfo/{id}")
    Call<ResponseBody> getBlog2(@Path("id") String id);
    
}

創建 同步/非同步 回調 

//非同步的回調
Call<ResponseBody> call = service.getBlog(123);
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
        try {
            Log.i("返回信息",response.body().string()+"");//列印返回信息
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        t.printStackTrace();//錯誤信息
    }
});

/*同步的回調,如果不是在一個Activity或者一個Fragment中去執行,那麼也就意味著,你可以不需要開啟子線程去執行網路請求。如果是在主線程,就必須開啟子線程來進行同步請求
使用call.execute()同步請求,只能調用一次。如果要多次使用這個方法,需要 call.clone()重新生成新的Call實例*/

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            retrofit2.Response<ResponseBody> response = call.execute();
            response.body();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});

HTTP協議中的常用請求

GET: 請求指定的頁面信息,以?分割URL和傳輸數據,參數之間以&相連,最多只能是1024位元組,並返回實體主體,該操作用於獲取信息而非修改信息

HEAD: 只請求頁面的首部。

POST: POST表示可能修改變伺服器上的資源的請求,.POST的安全性要比GET的安全性高

PUT: 從客戶端向伺服器傳送的數據取代指定文檔的內容。

Retrofit註解的重點詳解

註解彙總

需要理解並靈活搭配使用

基本請求

Responsebody是Retrofit網路請求回來的原始數據類。get方式可以在url後面串聯

@Path註解用於替換請求參數,@Query註解相當於url後面的串聯,他們可以同時使用

請看下麵第三種表達式:

@GET("/pursuit/getPursuitInfo?id=123")
Call<ResponseBody>  getCall();

@POST("/pursuit/getPursuitInfo")
Call<ResponseBody> getBlog(@Query("id") int id);

@GET("/pursuit/getPursuitInfo/{id}")
Call<ResponseBody> getBlog2(@Path("id") String id);

自定義請求

需要用到@HTTP註解

/* method:網路請求的方法,註意大小寫
 * path:網路請求地址路徑
 * hasBody:是否有請求體
 * {id} 表示是一個變數*/
@HTTP(method = "GET", path = "/pursuit/getPursuitInfo/{id}", hasBody = false)
Call<ResponseBody> getCall(@Path("id") int id);

請求體非Form表單

@Body是Post方式提交非Form的表單

@POST("/pursuit/getPursuitInfo")
Observable<String> getPursuitInfo(@Body User user);

請求體是Form表單

如果請求的Form表單,需要用@FormUrlEncoded標註,@Field註解用於表單欄位,它和@FieldMap都需要@FormUrlEncoded配合使用

@Field和@Query都是表單欄位,@FieldMap和@Query都是批量增加表單的提交域。區別如上圖,一個拼接在URL上適用於get方式,一個體現在請求體上試用於post方式,區分好使用場景。

@POST("/pursuit/getPursuitInfo") 
@FormUrlEncoded
Call
<ResponseBody> testFormUrlEncoded1(@Field("username") String name, @Field("age") int age);

設置請求頭

兩種請求頭的,@Header用於添加不固定的請求頭,作用於方法的參數。@Headers用於添加固定的請求頭,作用於方法

@Headers("Authorization: authorization")
@GET("/pursuit/getPursuitInfo")
Call<ResponseBody> getUser();

@GET("/pursuit/getPursuitInfo")
Call<ResponseBody> getUser(@Header("Authorization") String authorization);

動態替換URL

用@Url替換已經設置的baseUrl

@GET
public Call<ResponseBody> profilePicture(@Url String url);

圖片上傳

@POST("user/updateAvatar.do")
@Multipart
Call<ResponseBody> upload(@Part("upload1\"; filename=\"image1.jpg\"") RequestBody imgs );

文件上傳

發送form-encoded的數據,用於有文件上傳的場景時要用 @Multipart 註解,@Part和@PartMap適用於有文件上傳的情況

@POST("mobile/upload")
@Multipart
Call<ResponseBody> upload(@Part MultipartBody.Part file);

文件上傳相關閱讀

 輕鬆實現多文件/圖片上傳/Json字元串/表單

 Retrofit上傳文件的參數設置

※以上就是所有參數註解的用法,需要實踐靈活試用。

Retrofit與Gson

添加對gson的支持

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://id1.option****.cc:***1/")//Retrofit2 的baseUlr 必須以 /(斜線) 結束
        .addConverterFactory(GsonConverterFactory.create())//添加對gson的支持
        .build();

建立介面,返回Bean

public interface PostRoute {
   @Headers({"Content-Type: application/json","Accept: application/json"})//需要添加頭
   @POST("api/FlyRoute/Add")
   Call<FlyRouteBean> postFlyRoute(@Body RequestBody route);//傳入的參數為RequestBody
}

將Bean轉換成json字元串

FlyRouteBean flyRouteBean=new FlyRouteBean();
        flyRouteBean=initdata(flyRouteBean);//根據Bean類初始化一個需要提交的數據類
        Gson gson=new Gson();
        String route= gson.toJson(flyRouteBean);//通過Gson將Bean轉化為Json字元串形式 

提交json數據

RequestBody body=RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),route); //將json轉換成RequestBody請求體
Call<FlyRouteBean> call=postRoute.postFlyRoute(body);//提交

Retrifit與RxJava

引入RxJava

compile 'io.reactivex.rxjava2:rxjava:2.1.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

 添加對RxJava的支持

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://id1.option****.cc:***1/")//Retrofit2 的baseUlr 必須以 /(斜線) 結束
        .addConverterFactory(GsonConverterFactory.create())//添加對gson的支持
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//添加對RxJava的支持
        .build();

建立介面,返回Observable被觀察者

@GET("top250")
Observable<MovieEntity> getTopMovie(@Query("start") int start, @Query("count") int count);

建立觀察者

Observable<String> observable =service.getTopMovie(0, 10)
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<ResponseBody>() {
        @Override
        public void onSubscribe(Disposable d) {

        }

        @Override
        public void onNext(ResponseBody responseBody) {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {

        }
    });

RxJava相關閱讀

Android非同步框架 RxJava

Retrofit代碼混淆配置

-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepattributes Signature
-keepattributes Exceptions

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 解讀 "Retwis官網" 例子 Redis需要考慮需要哪些keys以及對應的value使用合適的數據類型進行存儲。在retwis例子中,我們需要users,user的粉絲列表, user的關註用戶列表等等。 Users 和傳統的關係型資料庫一樣,每個用戶有一個唯一的id關聯,使用INCR創建唯一的 ...
  • ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES) MYSQL 新建用戶 無法登錄 問題解決方法 ...
  • dx.bat :將所有的.class文件變成一個.dex文件。 aapt:Android Application package tools 安卓應用的打包工具。 adb:Android Debug Bridge 安卓調試橋。 intel,arm,mips Android版本對應Api級別: 2.3 ...
  • 有時候我們自定義一個View,比如ImageView,我們需要讓它寬高按照一定的比例顯示,例如在ImageView在GridView中顯示,GridView設置了3列,由於ImageVIew的寬度會根據屏幕的大小進行縮放的,如果不設置高度與寬度成一定比例的話,那麼可能會由於屏幕大小的變化而讓Imag ...
  • 當我們在Editext輸入內容的時候,檢測如果超過限制的長度無法輸入內容,並且給用戶提示。 首先我想到了下麵的方法: 未經測試,個人覺得這種體驗或許不是很好,或許會出現EdiText閃動。 其實我們可以用下麵這種方法: 源碼給Editext設置了過濾器,專門用來判斷是否超出最大的字元長度,把這段過濾 ...
  • 恢復內容開始 今天第一次用到ScrollView嵌套RecyclerView來做頁面。 剛開始效果開心得很,非常Very漂亮噢! 納尼!!!沃特Fuck!出事兒,出事兒! 滑動為何如此不流暢,隨後經過研究加上了一個關鍵屬性,如下: recyclerview.setNestedScrollingEna ...
  • 本文翻譯自:codementor 翻譯不當之處,歡迎指正交流 Web Components是web平臺的未來嗎?關於這一問題支持和反對的觀點有很多。事實上瀏覽器對Web Components的支持正在逐漸形成,並有越來越多的工具、資源和IT從業人員正在致力於創建發佈自己的Web Components ...
  • adb 命令模擬按鍵事件 模擬 點擊 事件 有時我們需要程式模擬按鈕或點擊,而手機本身又沒有,哪麽可以採取adb 模擬實現,最後再去實際設備去測試(前期一般都拿不到設備); 如模擬上一首,下一首,暫停等,手機上是沒有的,但有些設備上是有的; //這條命令相當於按了設備的語音鍵(按此鍵後,進入語音識別 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...