我想从API获得一个简单的字符串
通常,我可以通过以下函数从API获得我想要的一切:
class OrderRepositoryImpl(val orderService: OrderService) : OrderRepository {
override fun getPaymentMethods(id: String, success: (List<PaymentMode>) -> Unit, failure: (Throwable) -> Unit): Subscription {
return orderService.getPaymentMethods(id)
.subscribeOn(Schedulers.io())
.map { it.entrySet() }
.map { it.map { it.value }.map {it.asJsonObject } }
.map { it.map { PaymentMode().apply { loadFromJson(it) } } }
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ success.invoke(it) }, { failure.invoke(it) })
}
}
在订单服务中:
@GET("api/order/payment/modes/list/{id}")
fun getPaymentMethods(@Path("id") id: String): Observable<JsonObject>
这在具有常规Json对象的API上工作得很好。
但今天,我遇到了一个问题:我有一个带有唯一字符串的API,如下所示:
"validated"
或:
"draft"
因此,我制作了以下函数(在OrderRepositoryImpl类中(:
override fun getOrderStatus(id: String, success: (String) -> Unit, failure: (Throwable) -> Unit) =
orderService.getOrderStatus(id)
.subscribeOn(Schedulers.io())
.map { it }
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ success.invoke(it.toString()) }, { failure.invoke(it) } )
订单服务:
@GET("api/order/checkout/{id}/status")
fun getOrderStatus(@Path("id") id: String): Observable<JsonObject>
我这样称呼这种方法:
fun getOrderStatus(id : Long) {
orderRepository.getOrderStatus(id.toString(), {
println("SUCCESS !")
println("STATUS == $it")
}, {
println("FAILURE...")
})
}
但我并没有从"成功调用"这句话中得到任何东西。当我在代码中调用这个方法时,我的日志中总是有"FAILURE"。。。即使其中一条日志行是:
D/OkHttp: "validated"
这正是我希望在成功的情况下看到的。
我知道我可以获取和解析json对象,而不是字符串,这很奇怪,但我在工作中学到了
如何从API获取简单字符串?
好吧,我很惭愧。
所以,我在"失败…"部分打印了错误,我得到了这样的东西:
got jsonPrimitive but expected jsonObject
由于API只是返回一个字符串,而不是一个对象,所以它被称为Json Primitive。所以我只是更改了OrderService中函数的返回:
@GET("api/order/checkout/{id}/status")
fun getOrderStatus(@Path("id") id: String): Observable<JsonPrimitive>
感谢您的宝贵意见。
interface ServiceInterFace {
@POST("api/order/checkout/{id}/status")
fun getOrderStatus(@Path("id") id: String): Call<String>
}
// calling from your main class
val id: String? = null
val retrofit = Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.baseUrl("----Your link here-----")
.build()
val scalarService = retrofit.create(ServiceInterFace::class.java!!)
val stringCall = scalarService.getOrderStatus(id)
stringCall.enqueue(object : Callback<String> {
override fun onResponse(call: Call<String>, response: Response<String>) {
if (response.isSuccessful) {
val responseString = response.body()//get response here
}
}
override fun onFailure(call: Call<String>, t: Throwable) {
Toast.makeText(this@Main2Activity, "Failed to connect server",
Toast.LENGTH_SHORT).show()
}
})
//import
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'