POSTING для API сервера с Kotlin (OkHttp / Retrofit)
Я пытаюсь выполнить POST-строки API в Kotlin, используя либо OkHttp, либо Retrofit.
Если я использую только OkHttp , независимо от того, что я POST, я всегда получаю пустой массив.
private fun sendRegistrationToServer(refreshedToken: String) { Log.e(_tag, "Refreshed token: " + refreshedToken) val okClient = OkHttpClient() val requestBody = FormBody.Builder() .add("id", "0") .add("token", refreshedToken) .build() val request = Request.Builder() .url("http://192.168.1.27/cacklechat/updates") .post(requestBody) .build() try { val response = okClient.newCall(request).execute() Log.e("B_RES", response.body()?.string()) } catch (e: IOException) { Log.e("RES_FAIL", e.toString()) } }
Логкат говорит:
- Android Room - выбор запроса с помощью LIKE
- Почему моя установка RxJava блокирует мой поток пользовательского интерфейса? Работа с обратным вызовом BluetoothAdapter.startLeScan
- Я сейчас разрабатываю приложение для Android с Kotlin, но произошла ошибка: CompilationException: не удалось встроить метод в 'readText'
- Применение плагина «kotlin-android» в мгновенном приложении приводит к тому, что «null не может быть применено к ненулевому типу com.android.build.gradleBasePlugin»
- Kotlin Gson Deserializing
01-09 17:58:24.054 20439-20670/cackle.cackle_android E/B_RES: Array ( )
Если я тестирую API с помощью клиента REST, все работает нормально, и я возвращаю то, что я сделал POST. (Прямо сейчас API просто отправляет обратно $_POST
)
Если я попробую с помощью Retrofit использовать следующий код:
private fun sendRegistrationToServer(refreshedToken: String) { Log.e(_tag, "Refreshed token: " + refreshedToken) val apiBaseUrl = "http://192.168.1.27/cacklechat/" val okClient = OkHttpClient().newBuilder().build() val retrofit = Retrofit.Builder() .baseUrl(apiBaseUrl) .client(okClient) .addConverterFactory(GsonConverterFactory.create()) .build() val backendService = retrofit.create(BackendService::class.java) val call = backendService.updateToken("0", refreshedtoken) val result = call.execute().body() Log.e("RES", result.toString()) } interface BackendService { @POST("updates") fun updateToken( @Field("id") id: String, @Field("token") token: String ): Call }
Я просто получаю сообщение об ошибке:
01-09 18:01:41.415 21218-21535/cackle.cackle_android E/AndroidRuntime: FATAL EXCEPTION: pool-3-thread-1 Process: cackle.cackle_android, PID: 21218 java.lang.IllegalArgumentException: Unable to create call adapter for interface okhttp3.Call for method BackendService.updateToken at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:752) at retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:237) at retrofit2.ServiceMethod$Builder.build(ServiceMethod.java:162) at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:170) at retrofit2.Retrofit$1.invoke(Retrofit.java:147) at java.lang.reflect.Proxy.invoke(Proxy.java:913) at $Proxy1.updateToken(Unknown Source) at cackle.cackle_android.InstanceIdService.sendRegistrationToServer(InstanceIdService.kt:50) at cackle.cackle_android.InstanceIdService.onTokenRefresh(InstanceIdService.kt:34) at com.google.firebase.iid.FirebaseInstanceIdService.handleIntent(Unknown Source:12) at com.google.firebase.iid.zzg.run(Unknown Source:26) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at java.lang.Thread.run(Thread.java:764) Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for interface okhttp3.Call. Tried: * retrofit2.ExecutorCallAdapterFactory at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:241) at retrofit2.Retrofit.callAdapter(Retrofit.java:205) at retrofit2.ServiceMethod$Builder.createCallAdapter(ServiceMethod.java:235) ... 12 more
Я не смог найти способ решить эту проблему после многих часов Googling и нескольких попыток.
- Как получить ссылку на пользовательские идентификаторы в значениях / ids.xml
- Чистая архитектура: ViewModel с несколькими UseCases на Android
- kotlin 1.1.4 примитивы в родовом классе
- Установить значение поля без вызова метода set - Kotlin
- Плагин android studio с id: 'kotlin-android-extensions'
- Большой размер файла при преобразовании растрового изображения в PDF
- Преобразование единиц измерения в километры до миль не возвращает ожидаемый результат
- Отсутствует конструктор для DialogPreference