如何使用Retrofit @Query调用REST API

时间:2018-10-12 03:58:09

标签: android api kotlin retrofit

我无法获得基于idCafe的数据库。

这是来自webservice的网址:

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 :(得分:0)

像这样使用

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

您不必在URL内包含查询变量

答案 1 :(得分:0)

当您使用@Query时,翻新将为您构建查询参数。无需在URL中指定。

这意味着您应该像这样声明接口:

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

然后,Retrofit将使用注释内的名称-idCafe-并使用该名称构建参数。

您可以继续使用字符串,因为改型可以轻松处理它。但是,如果将idCafe更好地建模为应用程序中的整数,则建议您改用Int

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

请注意,这仅是可能的,因为URL idCafe中是整数。

答案 2 :(得分:0)

像这样调用您的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;
     }
}

您无法在API调用中使用Call<List<Table>>,因为错误提示“ BEGIN_ARRAY但是BEGIN_OBJECT”