从rxjava / retrofit POST请求中检索JSON响应

时间:2017-06-29 17:11:57

标签: android retrofit rx-java kotlin retrofit2

我已经使用rxjava和retrofit创建了一个POST请求,该请求成功点击我的后端服务器并将用户登录(我在我的控制台得到201响应,一切都很好)。但是,我想检索返回的用户访问令牌,但是当我尝试访问rxjava结果时,它只是给我传递给它的对象。无处可以找到如何获得json成功响应。我也确认了邮递员实际上有一个回应,所以这与我如何打电话有关。

这是我的Retrofit部分

@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
        }

当我尝试访问结果时出现混乱 - &gt; compositeDisposable调用的一部分。它只打印出UserLogin对象。我在这里错过了什么吗?谢谢。

1 个答案:

答案 0 :(得分:0)

原来我正在返回我的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