ネットワーク リクエスト フレームワーク Retrofit (Kotlin) の基本的な使用方法

数日前に紹介されました

Kotlin の基本的な使い方と基本クラスのカプセル化、MVVM と DataBinding

LiveData の二次パッケージ化、Kotlin での使用が簡単

Android プロジェクトはそれを依存関係として使用します

子犬: 基本的に上記で完全なプロジェクトを実現できます
慕容海珠: 何が足りないと思いますか?
子犬: 何が足りない、それで十分です
慕容海珠: では、ネットワーク リクエストには何を使いますか? OKHTTP? パピー:よし
、後付けで使おう 慕容
海珠: 使い方は?
子犬の卵: 歩く

まずは依存関係をインポート、自分で依存関係を書く方法は上記
参照 リクエストがあれば解析も含めます!

    implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'

次に、メソッドに関連するデータを書き込むだけで使用できます。

慕容海珠:騒ぐなよ!

Retrofit は、OKHTTP カプセル化に基づくリクエスト フレームワークです。OKHTTP 用の服を着ているだけと理解できます。OKHTTP は内部でまだアクティブです。服は見栄えを良くするためのもので、リクエスト本文は動的な登録とアノテーションによって構築されます。 。

ここでは Android のオープン API を例に説明しますが、このデモは正常に動作します。

GETリクエスト

ここに画像の説明を挿入

fun getData(){
    
    
        val mGson = GsonBuilder()
            .setLenient() // 设置GSON的非严格模式setLenient()
            .create()
        Retrofit.Builder()
            .baseUrl("https://www.wanandroid.com/")
            .addConverterFactory(GsonConverterFactory.create(mGson))
            .build()
            .create(getData::class.java)
            .getJsonData()
            .enqueue(object : Callback<JsonsRootBean?> {
    
    
                override fun onResponse(call: Call<JsonsRootBean?>, response: Response<JsonsRootBean?>) {
    
    
                    //请求成功走这里
                    val body: JsonsRootBean? = response.body()
                }
                override fun onFailure(call: Call<JsonsRootBean?>, t: Throwable) {
    
    
                    //请求失败走这里
                    Log.e(TAG, "onFailure: $t")
                }
            })
    }
    interface getData {
    
    
        @GET("article/list/1/json")
        fun getJsonData(
            //这里面放参数
        ): Call<JsonsRootBean>
    }

POSTリクエスト

ここに画像の説明を挿入

fun postData(){
    
    
        var mGson = GsonBuilder()
            .setLenient() // 设置GSON的非严格模式setLenient()
            .create()
        Retrofit.Builder()
            .baseUrl("https://www.wanandroid.com/")
            .addConverterFactory(GsonConverterFactory.create(mGson))
            .build()
            .create(postData::class.java)
            .getJsonData(
                "我是Token",
                "我是其他的数据")
            .enqueue(object : Callback<JsonsRootBean?> {
    
    
                override fun onResponse(call: Call<JsonsRootBean?>, response: Response<JsonsRootBean?>) {
    
    
                    val body = response.body()
                }
                override fun onFailure(call: Call<JsonsRootBean?>, t: Throwable) {
    
    
                    Log.e(TAG, "onFailure: $t")
                }
            })
    }

    interface postData{
    
    
        @FormUrlEncoded
        @POST("article/cutStore")
        fun getJsonData(
            @Header("apikey") apikey: String,
            @Field("articleid") articleid: String?,
        ): Call<JsonsRootBean>
    }

Entityクラス:Kotlinを使用しているためget setメソッドが必要ないので、最後に忘れずにインスタンス化してください

class JsonsRootBean(
    private var data: Data? = null,
    private var errorcode: Int = 0,
    private var errormsg: String? = null
) : Serializable

class Datas(
    var apklink: String? = null,
    var audit: Int = 0,
    var author: String? = null,

    var canedit: Boolean = false,

    var chapterid: Int = 0,

    var chaptername: String? = null,
    var collect: Boolean = false,

    var courseid: Int = 0,
    var desc: String? = null,

    var descmd: String? = null,

    var envelopepic: String? = null,
    var fresh: Boolean = false,
    var host: String? = null,
    var id: Int = 0,
    var link: String? = null,

    var nicedate: String? = null,

    var nicesharedate: String? = null,
    var origin: String? = null,
    var prefix: String? = null,

    var projectlink: String? = null,

    var publishtime: Int = 0,

    var realsuperchapterid: Int = 0,

    var selfvisible: Int = 0,

    var sharedate: Int = 0,

    var shareuser: String? = null,

    var superchapterid: Int = 0,

    var superchaptername: String? = null,
    //var tags: ArrayList<String>? = arrayListOf(),
    var title: String? = null,
    var type: Int = 0,

    var userid: Int = 0,
    var visible: Int = 0,
    var zan: Int = 0,
) : Serializable

class Data(
    var curpage: Int = 0,
    var datas: List<Datas>? = null,
    var offset: Int = 0,
    var over: Boolean = false,

    var pagecount: Int = 0,
    var size: Int = 0,
    var total: Int = 0,
) : Serializable


一見すると、このコードは OKHTTP とあまり変わりません。心配しないでください。よく見てください。

ここに画像の説明を挿入
通常の状況では、これらの部品を個別に取り出して集中管理し、切り離すことができます。

OKHTTPと比較してリクエストデータ部分を見てみましょう。Getとpostはコメントという形で別々に取り出しています。ttpの場合は毎回.add(" "," ")が必要で、個別に取得したいのですが、大まかに言えば、小さなエンティティ クラスまたはマップを作成していますか? (実際には、FormBody を渡すことができます) ttp は、リクエストが成功するたびに Gson に移動する必要があり、fit は必要ありません。本体を直接使用します

慕容海珠:他の人はどうですか?

子犬の卵:。, まあ、公式であれこれサポートされている以外は特に使うことはありませんが、コード量や書き方は確かに格段に使いやすくなりました。賞賛!

犬の卵のヒント:
リクエスト時に解析エラーが発生する可能性があります: JsonSyntaxException、
パニックにならないでください
1. ログ エラーによると
ここに画像の説明を挿入
、どのパラメータ解析エラーが間違っているかを明確に指摘しました。プロンプトに従って変更するだけです。できる場合は、変更しないでください。このパラメータが役立つかどうかを確認してください。これはインターネットで一般的に使用されています。役に立たないものはコメントアウトしてください、ふふふ

2. ログに有用な情報がない場合でも
、エラーの種類を指摘し、その種類に基づいてエラーを推測します。バックエンド パートナーに確認して、一貫性のあるものに変更するか、ログがない場合は、バックエンド パートナーに確認して変更します。直接的な証拠がある場合は、パケット キャプチャを実行して確認してください。スクリーンショットを持っている人を見つけてください、Ori

おすすめ

転載: blog.csdn.net/As_thin/article/details/123816373