【发布时间】:2017-12-03 12:24:50
【问题描述】:
我使用 rxjava 和改造创建了一个 POST 请求,该请求成功地访问了我的后端服务器并将用户登录(我在控制台中收到 201 响应,一切都很好)。但是,我想检索返回的用户访问令牌,但是当我尝试访问 rxjava 结果时,它只是给了我传递给它的对象。我无处可以找到如何获得 json 成功响应。我还验证了 Postman 中确实有响应,所以这与我拨打电话的方式有关。
这是我的改造部分
@Headers("Content-Type: application/json")
@POST("api/v1/login")
fun loginTask(@Body credentials: UserLogin)
: Observable<UserLogin>
以及对应的API函数
class ApiFunctions(val apiService: LunchVoteApi) {
fun provideHello(): io.reactivex.Observable<Hello> {
return apiService.helloMessage()
}
fun loginTask(email: String, password: String): io.reactivex.Observable<UserLogin> {
val credentials: UserLogin = UserLogin(email, password)
return apiService.loginTask(credentials)
}
}
Gson 反序列化的 UserLogin 模型
data class UserLogin(
@SerializedName("email") val email: String,
@SerializedName("password") val password: String
)
最后是我的 LoginActivity 中的调用
val loginTask = ApiProvider.provideLoginTask()
override fun doInBackground(vararg params: Void): Boolean? {
// TODO: attempt authentication against a network service.
try {
// Simulate network access.
// Thread.sleep(2000)
compositeDisposable.add(
loginTask.loginTask(mEmail, mPassword)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe ({
result ->
System.out.println(result.toString())
}, { error ->
System.out.println(error)
})
)
} catch (e: InterruptedException) {
return false
}
当我尝试访问 CompositeDisposable 调用的结果 -> 部分时,就会出现混乱。它只是打印出 UserLogin 对象。我在这里错过了什么吗?谢谢。
【问题讨论】:
-
看起来您在请求中传递并获得响应的数据属于同一类型 (
UserLogin)....当您说“它只是打印出 UserLogin 对象”时,请执行您的意思是它打印的值与您在请求中提供的值相同?您期望访问令牌在哪里(应该是返回类型?) -
@JohnO'Reilly 嗨,约翰。是的,它在结果部分打印出一个 UserLogin 对象。访问令牌的格式为 {accessToken: "token"},我现在可以在邮递员中清楚地看到它。所以不知何故我没有得到我需要的 JSON 响应。
-
在这种情况下,您在
fun loginTask(@Body credentials: UserLogin) : Observable<UserLogin>中的返回类型似乎有误...返回类型应该使用具有accessToken属性的pojo) -
@JohnO'Reilly 啊啊啊啊。让我试试。谢谢
-
@JohnO'Reilly 我无法确定需要将对象从 UserLogin 更改为具有 accesstoken 属性的对象。我会将改造功能更改为有趣的 loginTask(@Body credentials: UserLogin) : Observable
吗?如果是这样,我如何向我的服务器提供凭据,同时还需要 Accesstoken 返回类型
标签: android retrofit rx-java kotlin retrofit2