从API获取一个简单字符串



我想从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' 

最新更新