如何从web API POST和GET数据.(改造/芬兰湾的科特林/ Android)



我是web api和改造的新手。我正在与catapi交互,并且在获取我发布的数据时遇到麻烦。该API有一个图像列表和一个功能,可以通过POST请求选择几个作为收藏夹,并检索收藏夹列表。

我的主要问题可能与数据类有关(我有2个):

-For Image GET请求

data class CatPhoto (
@Json(name = "id")
val id: String,
@Json(name = "url")
val imgSrcUrl: String,
@Json(name = "breeds")
val breeds: List<Any>,
@Json(name = "width")
val width: Int,
@Json(name = "height")
val height: Int
)
@GET("$API_V/favourites?limit=100")
suspend fun getMyFavorites(
@Query("sub_id") subId: String
): List<CatPhoto>

-使用POST请求将图片设置为收藏夹

data class FavouriteImage (
val image_id: String,
val sub_id: String,
)
@POST("$API_V/favourites?limit=100")
suspend fun addFavorite(
@Body favouriteImage: FavouriteImage
)

这是我发布收藏夹并尝试检索已发布的收藏夹列表后的错误:

com.squareup.moshi。JsonDataException: $[1]中缺少所需值'imgSrcUrl' (JSON名称'url')

看起来它期待FavouriteImage数据类上的imgSrcUrl属性,这让我认为我甚至不应该有FavouriteImage类。但是,我如何使post请求需要image_idsub_id在主体中?

下面是我在API服务文件中设置数据库的方法:
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
private val retrofit = Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(BASE_URL)
.build()
object CatsApi {
val catsApiService : CatsApiService by lazy {
retrofit.create(CatsApiService::class.java)
}
}

github项目后端

编辑@extremeoats在评论中写道,api不支持传递url图像标识符,你必须保存它的id也为操作,如制作收藏夹等。

老回答

你能添加一些代码来说明请求是如何产生的吗?这是Moshi试图解析响应时的本地错误没有看到所需的字段(可能从服务器得到错误-错误的数据结构与正常响应不同)

我已经构建了一个示例应用程序来测试这一点,并在将图像标记为最喜欢时得到适当的响应。使用带有image_id和sub_id的结构是正确的。下面是一些代码部分,如果有帮助的话
  1. 设置Retrofit(仅用于调试的拦截器,因此您可以看到您发送和收到的确切内容)
private val interceptor = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
private val retrofit = Retrofit.Builder()
.baseUrl(ServerApi.BASE_URL)
.client(
OkHttpClient.Builder()
.addInterceptor(interceptor)
.build()
)
.addConverterFactory(MoshiConverterFactory.create())
.build()
private val api = retrofit.create(ServerApi::class.java)

1.1。日志拦截器和OkHttp的依赖项

implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0'
  1. Api接口

    interface ServerApi {
    companion object {
    const val API_KEY: String = **PASTE YOUR API KEY HERE**
    const val AUTH_HEADER = "x-api-key"
    const val BASE_URL = "https://api.thecatapi.com/v1/"
    }
    @GET("images/search")
    fun getImages(@Header(AUTH_HEADER) authHeader: String = API_KEY, @Query("limit") limit: Int = 5): Call<List<ImagesItem>>
    @POST("favourites")
    fun postFavourite(@Header(AUTH_HEADER) authHeader: String = API_KEY, @Body payload: PostFavouritePayload): Call<String>
    }
    private var listMyData = Types.newParameterizedType(List::class.java, ImagesItem::class.java)
    private val adapter: JsonAdapter<List<ImagesItem>> = Moshi.Builder().build().adapter(listMyData)
    
  2. 使用api

    api.getImages().enqueue(object : Callback<List<ImagesItem>> {
    override fun onResponse(call: Call<List<ImagesItem>>, response: Response<List<ImagesItem>>) {
    val images = response.body() ?: return
    api.postFavourite(payload = PostFavouritePayload(images[0].id, **PASTE ANY STRING HERE AS USER ID**))
    .enqueue(object : Callback<String> {
    override fun onResponse(call: Call<String>, response: Response<String>) =
    Log.d("TestCatApi", "SUCCESS posting a fav: ${response.body()}")
    override fun onFailure(call: Call<String>, t: Throwable)  =
    t.printStackTrace()
    })
    }
    override fun onFailure(call: Call<List<ImagesItem>>, t: Throwable) =
    t.printStackTrace()
    })
    

指出:

  1. 对于这样的示例api,我发现非常有用的插件"Json到Kotlin类"。Alt+K,然后您可以粘贴来自服务器或示例中的字符串响应,并且您有一个不错的数据类(不关联于它们)的起点

  2. 以防万一:你可以像这样传递一个baseUrl给Retrofit构建器

    Retrofit.Builder()
    .baseUrl(ServerApi.BASE_URL)...
    

然后输入@Get, @Post等,只输入"/"基本url: "images/search">

相关内容

  • 没有找到相关文章

最新更新