Как вызвать REST API с помощью Retrofit @Query - PullRequest
0 голосов
/ 12 октября 2018

Не могу получить базу данных на idCafe.

Это URL-адрес веб-службы:

https://admin -services-dot-annular-bucksaw-167705.appspot.com / _ah / api / meja? IdCafe = 123445

Интерфейс службы API:

@GET ("meja?idCafe")
fun getTable(@Query("idCafe") idCafe: String): Call<List<Table>>

Я вызываю API с этой функцией:

private fun getTableList(idCafe:String){
    val apiService : Service = Client.getClient()!!.create(Service::class.java)
    apiService.getTable(idCafe).enqueue(object : Callback<List<Table>>{

        override fun onResponse(call: Call<List<Table>>?, response: Response<List<Table>>?) {

            Log.i("IdMeja", "id : " + response?.body())
            if (response != null && response.isSuccessful) {
                val listTable = response.body()
                if (listTable == null || listTable.isEmpty()) {
                    Toast.makeText(this@MainActivity, "Tidak ada meja", Toast.LENGTH_SHORT).show()
                }
                else{
                    tableList = ArrayList(listTable)
                    // update list table
                    dataAdapter.updateData(tableList)
                }
            }
            else{
                Log.i("idCafe", " $idCafe")
                Toast.makeText(this@MainActivity, "Gagal dapat meja", Toast.LENGTH_SHORT).show()

            }
        }

        override fun onFailure(call: Call<List<Table>>?, t: Throwable?) {

            Log.i("fail",t.toString() )
            Toast.makeText(this@MainActivity, "Gagal", Toast.LENGTH_SHORT).show()
        }
    })
}

Но ответ не выполнен.Я могу получить idCafe, но не могу получить данные таблицы.Пожалуйста, помогите мне исправить это.

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Когда вы используете @Query Retrofit создаст для вас параметр запроса.Нет необходимости указывать его в URL.

Это означает, что вы должны просто объявить интерфейс следующим образом:

@GET ("meja")
fun getTable(@Query("idCafe") idCafe: String): Call<List<Table>>

При модификации будет использоваться имя внутри аннотации - idCafe - и построенопараметр с ним.

Вы можете продолжать использовать строку, так как модернизация может легко справиться с этим.Однако, если idCafe лучше смоделировать как целое число в вашем приложении, я бы посоветовал вам использовать Int вместо:

@GET ("meja")
fun getTable(@Query("idCafe") idCafe: Int): Call<List<Table>>

Обратите внимание, что это возможно только потому, что в URL idCafeявляется целым числом.

0 голосов
/ 12 октября 2018

Назовите свой API следующим образом

@GET ("meja")
fun getTable(@Query("idCafe") idCafe: String): Call<TableResponse>

И ответный вызов таблицы будет выглядеть следующим образом -

class TableResponse {
     @SerializedName("daftarMeja")
     List<Table> list;

     public List<Table> getList() {
          return list;
     }

     public void setList(List<Table> list) {
          this.list = list;
     }
}

Вы не можете использовать Call<List<Table>> в результате вызова APIкак ошибка говорит "BEGIN_ARRAY, но был BEGIN_OBJECT"

0 голосов
/ 12 октября 2018

используйте вот так

@GET ("meja")
fun getTable(@Query("idCafe") idCafe: Int): Call<List<Table>>

Вам не нужно включать ? и переменную запроса внутри вашего URL.

...