我想在Android客户端和Spring Boot服务器之间创建一个REST-API。我创建了一个OpenAPI 3.0规范,并使用来自https://openapi-generator.tech的CLI生成器来创建客户端和服务器存根。
当其他客户端访问服务器部分时,服务器部分按预期工作。
对于客户端,我通过参数——additional-properties=library=jvm-retrofit2使用带有Retrofit2的Kotlin生成器。我得到的是:
- 一个ModelApi接口,定义我的端点 一个Model类,包含我的Model
- 一个基础设施包,包含ApiClient, ResponseExt, Serializer, CollectionFormats和一些*Adapter类
生成的模型类(缩短):
data class MapModel (
@Json(name = "id")
val id: kotlin.Long? = null,
@Json(name = "description")
val desc: String? = null
)
API接口:
interface MapModelApi {
@GET("mapModel")
fun mapModelGet(): Call<kotlin.collections.List<MapModel>>
@DELETE("mapModel/{mapModelId}")
fun mapModelMapModelIdDelete(@Path("mapModelId") mapModelId: kotlin.Int): Call<Unit>
@GET("mapModel/{mapModelId}")
fun mapModelMapModelIdGet(@Path("mapModelId") mapModelId: kotlin.Int): Call<MapModel>
@PUT("mapModel/{mapModelId}")
fun mapModelMapModelIdPut(@Path("mapModelId") mapModelId: kotlin.Int, @Body mapModel: MapModel): Call<Unit>
@POST("mapModel")
fun mapModelPost(@Body mapModel: MapModel): Call<Unit>
@PUT("mapModel")
fun mapModelPut(@Body mapModel: MapModel): Call<Unit>
}
在元素0上做一个GET请求,我在我的活动中尝试了这个:
val apiClient = ApiClient()
val mapObjectService = apiClient.createService(MapModelApi::class.java)
val call = mapObjectService.mapModelMapModelIdGet(0)
call.enqueue(object : Callback<MapModel> {
override fun onFailure(
call: Call<MapModel>,
t: Throwable
) {
Log.v("retrofit", "call failed")
t.printStackTrace()
}
override fun onResponse(
call: Call<MapModel>,
response: Response<MapModel>
) {
if (response.isSuccessful) {
val mapModel = response.body()
println(mapModel?.id)
} else {
val statusCode = response.code()
println("Http Code: $statusCode")
}
}
})
当我执行这个时,我得到一个响应,但它总是501响应"未实现"。我该如何解决这个问题?代码中缺少什么?
服务器是问题所在。GET请求返回了包含示例数据的正文。我注意到,服务器发送的请求代码不是200,而是501。