Задать вопрос
@YuriyBum334

Retrofit kotlin код запроса не выполняется, почему?

Простой запрос для получения данных в формате json. Проблема в том, что при успешной(!) отправке запроса код onResponce не выполняется вообще никак - ни результата, ни ошибки, ни исключений - ничего, как будто программа просто пропускает эти строки. При этом onFailure() в случае с заведомо битым запросом (например, заведомо битой ссылкой) выполняется! Проверял многократно. Подозреваю, что проблема в данных с сервера - сервер возвращает не чистый json, а json внутри тегов , . Может ли быть проблема в этом?

Интерфейс:
import retrofit2.Call
import retrofit2.http.GET

interface OrgList {
    @GET("test.php/")
    fun getcompanyes(): Call<List<Company?>?>

}


Код клиента:
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

object RetrofitClient {


   var retrofit = Retrofit.Builder()
//Адрес источника публиковать не могу, поэтому заменил
        .baseUrl("https://domain.ru/text/")
        .addConverterFactory(GsonConverterFactory.create())
        .build()
    var companyes = retrofit.create(OrgList::class.java)

    }

Собственно, сам запрос:
val headtext: TextView = findViewById(R.id.textView)


        try {

            val orgs: Call<List<Company?>?>? =
            RetrofitClient.companyes.getcompanyes()

            orgs?.enqueue(object : Callback<List<Company?>?> {
                override fun onFailure(call: Call<List<Company?>?>, t: Throwable) {
//Без проблем выполняется, если ссылка baseUrl битая (например, http вместо https)
                    Toast.makeText(applicationContext, "Failed callback! ${t.message}", Toast.LENGTH_LONG).show()
                }

                override fun onResponse(
                    @NonNull call: Call<List<Company?>?>,
                    @NonNull response: Response<List<Company?>?>
                ) {
/*Ничего из этого не выполняется, ошибка не выводится, onFailure тоже не выполняется - просто ничего не происходит*/
                    headtext.text = response.body()?.toString()
                    Toast.makeText(applicationContext, response.body()?.toString(), Toast.LENGTH_LONG).show()
                }

            }         )

        } catch (e: Exception) {
            headtext.text = "Exc: $e"
        }
  • Вопрос задан
  • 579 просмотров
Подписаться 1 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@Fillini
Во-первых в интерфейсе не надо писать nullable типы.
Call<List<Company?>?>

замените на
Call<List<Company>>

Ну и ответ с сервера должен приходить в json формате, а не какие то там теги

Если вы хотите прежде чем парсить результат от сервера отчистить его от ненужных тегов, то:
interface OrgList {
    @GET("test.php/")
    fun getcompanyes(): Call<List<Company?>?>
}


замените на :

Если вы хотите прежде чем парсить результат от сервера отчистить его от ненужных тегов, то:
interface OrgList {
    @GET("test.php/")
    fun getcompanyes(): Call<ResponseBody>
}

и методе orgs?.enqueue получайте. ResponseBody.toString() для анализа и удаления ненужных тегов. Дальше отчищенный json можно распарсить Gson'ом
Ответ написан
Комментировать
Logos_Intellect
@Logos_Intellect
Android developer
Тебе нужно залогировать ответ с сервера. Для этого можно использовать несколько инструментов:
  1. Network Profiler
  2. Stetho
  3. OkHttp logging interceptor


И еще ты очень сильно перебарщиваешь с nullable типами. Не нужно на всех моделях подряд ставить вопросительный знак)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы