web-dev-qa-db-ja.com

KotlinでAPIリクエストを行う方法は?

私はKotlinとAPI全般に関して非常に新しいので、この言語を使用してAPIリクエストを作成する構文が見つかりません。ウェブサイトのモバイルバージョンを作成しているので、Android St​​udioを使用して、既に確立されているバックエンド用の新しいUIを作成しています。リクエストを作成する手順と構文は何ですか?どんな助けも大歓迎です。

19
Nutters

Android St​​udioでKotlinを使用するように設定 ができたら、REST呼び出しを行うのは非常に簡単で、Javaとほぼ同じロジックです。


OkHttp を指定したREST呼び出しの例を次に示します。

build.gradle

dependencies {
    //...
    implementation 'com.squareup.okhttp3:okhttp:3.8.1'
}

AndroidManifest.xml

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

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private val client = OkHttpClient()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        run("https://api.github.com/users/Evin1-/repos")
    }

    fun run(url: String) {
        val request = Request.Builder()
                .url(url)
                .build()

        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {}
            override fun onResponse(call: Call, response: Response) = println(response.body()?.string())
        })
    }
}

以下は、他のライブラリを使用したさらにいくつかの複雑な例です。

32
Evin1_

RetrofitまたはAsyncTaskを使用できます。AsyncTaskの例:

    class getData() : AsyncTask<Void, Void, String>() {
        override fun doInBackground(vararg params: Void?): String? {
        }

        override fun onPreExecute() {
            super.onPreExecute()
        }

        override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
        }
}

for Retrofit for this awsome tutorial

5
Oussema Aroua

レトロフィット2を使用してサンプルAPIコールを作成しました。まず、これらのライブラリをgradleに追加します

implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation "com.squareup.retrofit2:converter-gson:2.3.0"
implementation "io.reactivex.rxjava2:rxandroid:2.0.1"

次に、Retrofit 2を構成するクラスを作成します(Connect.ktなど)

class Connect {

    companion object {

        private fun getRetrofit(Url:String):Retrofit {
            return Retrofit.Builder()
                    .addCallAdapterFactory(
                            RxJava2CallAdapterFactory.create())
                    .addConverterFactory(
                            GsonConverterFactory.create())
                    .baseUrl(Url)
                    .build()
        }

        fun getApiData():Retrofit{
            val retrofitApi = getRetrofit(Url.BASE_URL)
            return retrofitApi
        }

        fun callApi():CallApi{
            val retrofitCall = getApiData()
            return retrofitCall.create(CallApi::class.Java)
        }

    }
}

Url.ktというUrlクラスでUrlを作成しました

class Url {
    companion object {
        const val BASE_URL = "your base url"
        const val URL = "your url"
    }
}

API呼び出しのインターフェースを作成しました

    interface CallApi {

        @GET(Url.URL)
//query needed if there is any query
        fun getApi(@Query("limit") limit: Int):
//model class is needed                
Observable<Model.Result>
    }

応答に応じてモデルクラスを作成します。サンプル応答は

{
    "data": {
        "children": [
            {
                "data": {
                    "author": "",
                     "thumbnail":"",
                      "title":""
                     }
                 }]
          }
 }

モデルクラスを作成するために、たとえばModelというオブジェクトを作成します

object Model {
    data class Result(val data: Data)
    data class Data(val children: List<Children>)
    data class Children(val data: Datas)
    data class Datas(val author: String,val thumbnail: String,val title: String)
}

次に、ボイラープレートクラスを作成して、任意のアクティビティから呼び出すことができるAPIからデータフェッチを実行します

class ApiData {
    companion object {
        const val count = 10
        val api by lazy { Connect.callApi() }
        var disposable: Disposable? = null
        fun apiData(callback:Response){
            disposable = api.getApi(count)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe ({
                        result ->
                        callback.data(result,true)
                    }, { error ->
                        error.printStackTrace()
                    })

        }

    }
    interface Response {
        fun data(data:Model.Result,status:Boolean)
    }
}

今、それはのような活動から呼び出すことができます、

ApiData.apiData( object :ApiData.Response{
    override fun data(data: Model.Result, status: Boolean) {
        if(status){
            val items:List<Model.Children> = data.data.children
        }
    }

})
1
Rejsal

Retrofit は、AndroidでAPIを使用するのに適したツールです。 ここ は、KotlinでRetrofitを使用する方法について見つけたチュートリアルです

1
MacLean Sochor