2017-06-29 75 views
1

我已經使用rxjava和翻新功能創建了一個POST請求,它成功地點擊了我的後端服務器並記錄了用戶(我在控制檯中獲得201響應,都很好)。但是,我想要檢索返回的用戶訪問令牌,但是當我嘗試訪問rxjava結果時,它只是給了我傳遞給它的對象。我無法找到如何獲得json成功的迴應。我也證實郵差中實際上有一個響應,所以這是我如何進行這個調用。從rxjava /翻新POST請求中檢索JSON響應

這是我改造部分

@Headers("Content-Type: application/json") 
    @POST("api/v1/login") 
    fun loginTask(@Body credentials: UserLogin) 
      : Observable<UserLogin> 

而且correspoinding 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

反序列化
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對象。我在這裏錯過了什麼嗎?謝謝。

+0

它看起來像你傳遞的請求中獲得的數據是相同類型('UserLogin')....當你說「它只是打印出UserLogin對象」時,你的意思是它打印的值與你在請求中提供的值相同嗎?你在哪裏期待訪問令牌(應該是返回類型?) –

+0

@ JohnO'Reilly嗨John。是的,它打印出結果部分中的UserLogin對象。訪問令牌的格式爲{accessToken:「token」},我現在可以在postman中清楚地看到它。所以不知何故,我沒有得到我需要的JSON響應。 –

+0

在這種情況下,它看起來像在'fun loginTask(@Body credentials:UserLogin)中有錯誤的返回類型:Observable '...返回類型應該使用具有'accessToken'屬性的pojo] –

回答

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