私はKotlinとAPI全般に関して非常に新しいので、この言語を使用してAPIリクエストを作成する構文が見つかりません。ウェブサイトのモバイルバージョンを作成しているので、Android Studioを使用して、既に確立されているバックエンド用の新しいUIを作成しています。リクエストを作成する手順と構文は何ですか?どんな助けも大歓迎です。
Android Studioで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())
})
}
}
以下は、他のライブラリを使用したさらにいくつかの複雑な例です。
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
レトロフィット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
}
}
})