【问题标题】:Retrieve JSON response from rxjava/retrofit POST request从 rxjava/retrofit POST 请求中检索 JSON 响应
【发布时间】: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&lt;UserLogin&gt; 中的返回类型似乎有误...返回类型应该使用具有accessToken 属性的pojo)
  • @JohnO'Reilly 啊啊啊啊。让我试试。谢谢
  • @JohnO'Reilly 我无法确定需要将对象从 UserLogin 更改为具有 accesstoken 属性的对象。我会将改造功能更改为有趣的 loginTask(@Body credentials: UserLogin) : Observable 吗?如果是这样,我如何向我的服务器提供凭据,同时还需要 Accesstoken 返回类型

标签: android retrofit rx-java kotlin retrofit2


【解决方案1】:

原来我返回的是我的 UserLogin 类型,而不是带有访问令牌属性的 pojo 对象。

将我的改造电话改为@Headers("Content-Type: application/json") @POST("api/v1/login") fun loginTask(@Body credentials: UserLogin) : Observable<AccessToken>

并创建一个新模型

data class AccessToken( @SerializedName("accessToken") val email: String )

我现在可以打印出令牌。感谢@john-oreilly

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    相关资源
    最近更新 更多