Haciendo múltiples llamadas RxJava y usando el resultado para la próxima llamada -- android campo con kotlin campo con retrofit2 campo con rx-java2 camp Relacionados El problema

Doing multiple RxJava calls and using result for next call


-2
vote

problema

Español

Estoy tratando de usar Rxjava para resolver este problema. Tengo 3 llamadas que deben ejecutarse entre sí, utilizando el resultado de la última llamada para la siguiente llamada.

Por el bien de la simplicidad. He organizado 3 archivos en mi servidor que son las 3 llamadas:

http://jimclermonts.nl/booky/step1user

http://jimclermonts.nl/booky/step2cookie

http://jimclermonts.nl/booky/step3token

¿Cuál es la forma correcta y limpia de hacer esto?

build.gradle:

  // Retrofit implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-moshi:2.3.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0' implementation 'com.squareup.okhttp3:okhttp:3.9.0'  // reactive extensions implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0" implementation 'io.reactivex.rxjava2:rxjava:2.1.7' implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'   

principalactividad:

  override fun onCreate(savedInstanceState: Bundle?) {     super.onCreate(savedInstanceState)     setContentView(R.layout.activity_main)      val result = SomeWebService().getToken()     if (result != null) {         result.doOnComplete {              //how to get the token value?         }     } }   

somewebservice

  class SomeWebService {      lateinit var apiService: ApiService     var tokenResult: Observable<String>? = null      fun getToken() : Observable<String>? {         if (tokenResult == null) {             apiService = ApiService.retrofit.create(ApiService::class.java)             val body = step1ApiUserResponse()             val cookie = step2CookieResponse(body.blockingSingle())             val tokenResult = step3TokenResponse(cookie.blockingSingle())             this.tokenResult = tokenResult             tokenResult.doOnComplete {  }     } else {         tokenResult!!.doOnComplete {  }     }     return tokenResult     }      fun step1ApiUserResponse(): Observable<String> {         return Observable.create {             apiService.getStep1User()                     .subscribeOn(Schedulers.io())                     .observeOn(AndroidSchedulers.mainThread())                     .doOnSuccess { user ->                         val body = user.getResponse()                         if (body != null) {                             it.onNext(body)                         }                     }                     .doOnError {                         it.printStackTrace()                     }         }     }      fun step2CookieResponse(body: String): Observable<String> {         return Observable.create {             apiService.getStep2Cookie(body)                     .subscribeOn(Schedulers.io())                     .observeOn(AndroidSchedulers.mainThread())                     .doOnSuccess { result ->                         val bodyResult = result.body().toString()                         it.onNext(bodyResult)                     }         }     }      fun step3TokenResponse(cookie: String): Observable<String> {         return Observable.create {             apiService.getStep3Token(cookie)                     .subscribeOn(Schedulers.io())                     .observeOn(AndroidSchedulers.mainThread())                     .doOnSuccess { result ->                         val body = result.getToken()                         if (body != null) {                             it.onNext(body)                         }                     }         }     } }   

ApiService:

  interface ApiService {      @GET("/booky/step1user")     fun getStep1User(): Single<UserResponse>      @GET("/booky/step2cookie")     fun getStep2Cookie(body: String): Single<Response>      @GET("/booky/step3token")     fun getStep3Token(@Header("Cookie") sessionId: String): Single<TokenResponse>      companion object {          val interceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)         val client = OkHttpClient.Builder()                 .addInterceptor(interceptor)                 .build()          val retrofit = Retrofit.Builder()                 .baseUrl("http://jimclermonts.nl")                 .addConverterFactory(MoshiConverterFactory.create().asLenient())                 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())                 .client(client)                 .build()     } }   

tokenresponse:

  class TokenResponse {      @Json(name = "Token")     private var token: String? = null      fun getToken(): String? {         return token     }      fun setToken(token: String) {         this.token = token     } }   

userResponse:

  class UserResponse {      @Json(name = "Response")     private var response: String? = null      fun getResponse(): String? {         return response     }      fun setResponse(response: String) {         this.response = response     } }   
Original en ingles

I'm trying to use RxJava to solve this problem. I have 3 calls that need to be executed after each other, using the result of the last call for the next call.

For sake of simplicity I've hosted 3 files on my server that are the 3 calls:

http://jimclermonts.nl/booky/step1user

http://jimclermonts.nl/booky/step2cookie

http://jimclermonts.nl/booky/step3token

What is the correct and cleanest way to do this?

build.gradle:

// Retrofit implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-moshi:2.3.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0' implementation 'com.squareup.okhttp3:okhttp:3.9.0'  // reactive extensions implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0" implementation 'io.reactivex.rxjava2:rxjava:2.1.7' implementation 'io.reactivex.rxjava2:rxandroid:2.0.2' 

MainActivity:

override fun onCreate(savedInstanceState: Bundle?) {     super.onCreate(savedInstanceState)     setContentView(R.layout.activity_main)      val result = SomeWebService().getToken()     if (result != null) {         result.doOnComplete {              //how to get the token value?         }     } } 

SomeWebService

class SomeWebService {      lateinit var apiService: ApiService     var tokenResult: Observable<String>? = null      fun getToken() : Observable<String>? {         if (tokenResult == null) {             apiService = ApiService.retrofit.create(ApiService::class.java)             val body = step1ApiUserResponse()             val cookie = step2CookieResponse(body.blockingSingle())             val tokenResult = step3TokenResponse(cookie.blockingSingle())             this.tokenResult = tokenResult             tokenResult.doOnComplete {  }     } else {         tokenResult!!.doOnComplete {  }     }     return tokenResult     }      fun step1ApiUserResponse(): Observable<String> {         return Observable.create {             apiService.getStep1User()                     .subscribeOn(Schedulers.io())                     .observeOn(AndroidSchedulers.mainThread())                     .doOnSuccess { user ->                         val body = user.getResponse()                         if (body != null) {                             it.onNext(body)                         }                     }                     .doOnError {                         it.printStackTrace()                     }         }     }      fun step2CookieResponse(body: String): Observable<String> {         return Observable.create {             apiService.getStep2Cookie(body)                     .subscribeOn(Schedulers.io())                     .observeOn(AndroidSchedulers.mainThread())                     .doOnSuccess { result ->                         val bodyResult = result.body().toString()                         it.onNext(bodyResult)                     }         }     }      fun step3TokenResponse(cookie: String): Observable<String> {         return Observable.create {             apiService.getStep3Token(cookie)                     .subscribeOn(Schedulers.io())                     .observeOn(AndroidSchedulers.mainThread())                     .doOnSuccess { result ->                         val body = result.getToken()                         if (body != null) {                             it.onNext(body)                         }                     }         }     } } 

ApiService:

interface ApiService {      @GET("/booky/step1user")     fun getStep1User(): Single<UserResponse>      @GET("/booky/step2cookie")     fun getStep2Cookie(body: String): Single<Response>      @GET("/booky/step3token")     fun getStep3Token(@Header("Cookie") sessionId: String): Single<TokenResponse>      companion object {          val interceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)         val client = OkHttpClient.Builder()                 .addInterceptor(interceptor)                 .build()          val retrofit = Retrofit.Builder()                 .baseUrl("http://jimclermonts.nl")                 .addConverterFactory(MoshiConverterFactory.create().asLenient())                 .addCallAdapterFactory(RxJava2CallAdapterFactory.create())                 .client(client)                 .build()     } } 

TokenResponse:

class TokenResponse {      @Json(name = "Token")     private var token: String? = null      fun getToken(): String? {         return token     }      fun setToken(token: String) {         this.token = token     } } 

UserResponse:

class UserResponse {      @Json(name = "Response")     private var response: String? = null      fun getResponse(): String? {         return response     }      fun setResponse(response: String) {         this.response = response     } } 
           
         
         

Lista de respuestas

1
 
vote

principalActividad:

    val service = SomeWebService()      service.getToken()             .subscribe(             { token ->                 Log.d("TOKEN", token)             },             {e ->                 Log.e("Token error", e.localizedMessage)             }     )   

SomeWebService:

  class SomeWebService {      lateinit var apiService: ApiService     var tokenResult: Observable<String>? = null      fun getToken(): Observable<String> {         apiService = ApiService.retrofit.create(ApiService::class.java)         return step1ApiUserResponse()                 .flatMap { body ->                     step2CookieResponse(body)                             .flatMap { cookie ->                                 step3TokenResponse(cookie)                             }                  }     }      fun step1ApiUserResponse(): Observable<String?> {         return apiService.getStep1User()                 .subscribeOn(Schedulers.io())                 .observeOn(AndroidSchedulers.mainThread())                 .map { user ->                     Log.d("Step1", user.toString())                     user.getResponse()                 }                 .toObservable()     }      fun step2CookieResponse(body: String): Observable<String?> {         return apiService.getStep2Cookie(body)                 .subscribeOn(Schedulers.io())                 .observeOn(AndroidSchedulers.mainThread())                 .map { result ->                     result.getCookie()                 }                 .toObservable()     }      fun step3TokenResponse(cookie: String): Observable<String?> {         return apiService.getStep3Token(cookie)                 .subscribeOn(Schedulers.io())                 .observeOn(AndroidSchedulers.mainThread())                 .map { result ->                     result.getToken()                 }                 .toObservable()     } }   
 

MainActivity:

  val service = SomeWebService()      service.getToken()             .subscribe(             { token ->                 Log.d("TOKEN", token)             },             {e ->                 Log.e("Token error", e.localizedMessage)             }     ) 

SomeWebService:

class SomeWebService {      lateinit var apiService: ApiService     var tokenResult: Observable<String>? = null      fun getToken(): Observable<String> {         apiService = ApiService.retrofit.create(ApiService::class.java)         return step1ApiUserResponse()                 .flatMap { body ->                     step2CookieResponse(body)                             .flatMap { cookie ->                                 step3TokenResponse(cookie)                             }                  }     }      fun step1ApiUserResponse(): Observable<String?> {         return apiService.getStep1User()                 .subscribeOn(Schedulers.io())                 .observeOn(AndroidSchedulers.mainThread())                 .map { user ->                     Log.d("Step1", user.toString())                     user.getResponse()                 }                 .toObservable()     }      fun step2CookieResponse(body: String): Observable<String?> {         return apiService.getStep2Cookie(body)                 .subscribeOn(Schedulers.io())                 .observeOn(AndroidSchedulers.mainThread())                 .map { result ->                     result.getCookie()                 }                 .toObservable()     }      fun step3TokenResponse(cookie: String): Observable<String?> {         return apiService.getStep3Token(cookie)                 .subscribeOn(Schedulers.io())                 .observeOn(AndroidSchedulers.mainThread())                 .map { result ->                     result.getToken()                 }                 .toObservable()     } } 
 
 

Relacionados problema

0  Búsqueda de rxsearchview  ( Rxsearchview search ) 
Mi pregunta es dos veces. Yo había estado usando RxSearchView por un tiempo. He usado map , filter y Finalmente switchMap Para consultar los eventos de...

0  Storio usando RX en lugar de reactivex  ( Storio using rx instead of reactivex ) 
Como dice el título, una de las importaciones en un archivo de la dependencia de la historias definidas en mi build.gradle es lo siguiente: import rx.Singl...

-1  La combinación de mapas de intervalo observable no funciona  ( Observable interval flatmap combination doesnt work ) 
Soy nuevo en Rxjava 2 y estoy tratando de ejecutar SomeMethod en el fondo con un intervalo dado y usar el resultado en el hilo de la interfaz de usuario. ¿Pue...

13  Obteniendo un error "Llamable devuelto NULL" cuando use RXJAVA2  ( Getting error callable returned null when using rxjava2 ) 
Estoy usando rxjava2 en mi proyecto Android. Estoy usando el siguiente código para crear el Observable public Observable<AlbumDetails> loadAlbumFromAlb...

5  Autobús de eventos de Rxjava  ( Rxjava event bus ) 
Uso de la primera versión de RxJava y page-teacher-filter { .home-container { overflow:auto; height: 100%; } } 0 TENIO SIGUIENTE p...

-3  RxJava2: usando concatenados completables y observándolos en el hilo IO  ( Rxjava2 using concatenated completables and observing them in io thread ) 
Al principio, sé que las operaciones de la red no deben llamarse desde el hilo principal. ¡Es por eso que estoy observando completables en programadores.io ()...

3  RxJava: Eliminar elemento de la lista  ( Rxjava remove element from list ) 
He intentado varios operadores para iterar objetos usando map , concatMap , all pero no puedo eliminar el elemento de mi lista. Aquí hay un pedazo de có...

2  Android no puede resolver el método de suscripción en RxJava  ( Android can not resolve subscribe method in rxjava ) 
Im tring para usar RxJava con modernización en el estudio Android. De hecho, seguí este https: // código. tutsplus.com/tutorials/getting-sarted-with-retrofit...

1  Manejar ONKEYDOWN usando rxandroid  ( Handle onkeydown using rxandroid ) 
Estoy usando https://github.com/mkoslacz/moviper para mi aplicación para Android Caja de TV. Solo hay una actividad con múltiples fragmentos de niños. Quier...

0  ¿Por qué alguna vez usaría rxjava2calladapterfactory.creewithscheduler?  ( Why would i ever use rxjava2calladapterfactory createwithscheduler ) 
Estoy usando Retrofit + RxJava2 y configuración de la fábrica de adaptadores de llamadas al crear un servicio de reequipación new Retrofit.Builder() .b...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos