5 votes

Utilisation de retrofit2 et RxAndroid pour obtenir une réponse de Spring WebFlux

Je ne suis pas certain de savoir comment configurer le côté Android pour désérialiser ceci.

C'est ma définition sur le serveur :

@GetMapping("/quotes-reactive-paged")
    fun getQuoteFlux(@RequestParam(name = "page") page: Int,
                     @RequestParam(name = "size") size: Int): Flux<Quote> {
        return quoteMongoReactiveRepository.retrieveAllQuotesPaged(PageRequest.of(page, size))
                .delayElements(Duration.ofMillis(DELAY_PER_ITEM_MS.toLong()))
    }

Du côté d'Android, j'ai ceci pour obtenir la réponse :

@GET("quotes-reactive-paged")
Observable<Quote> queryReactivePaging(@Query("page") int page,
                                              @Query("size") int size);

Et voici ce que j'utilise pour traiter :

mReactiveQuoteService.queryReactivePaging(page, size)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .map(cityResponse -> {
                return cityResponse;
            })
            .subscribeWith(new DisposableObserver<Quote>() {
                @Override
                public void onNext(Quote quote) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

                            System.out.println(quote.content);
                            reactiveList.setText(reactiveList.getText() + "\n" + quote.content);
                    } else {
                            System.out.println(quote.content);
                            reactiveList.setText(reactiveList.getText() + "\n" + quote.content);
                    }
                }

                @Override
                public void onError(Throwable e) {
                    System.out.println(e);
                }

                @Override
                public void onComplete() {
                    System.out.println("done");
                }
            })

Voici un exemple de réponse, imprimé par OkHttp3 :

data:{"id":"1025","book":"El Quijote","content":"-En efecto -dijo Sancho-, ¿qué es lo que vuestra merced quiere hacer en este tan remoto lugar?"}

Et voici ce que j'obtiens dans logcat, mais j'ai coupé certains des éléments de données.

05-04 21:41:58.056 13277-13338/reactive.android.cigna.com.reactiveexample D/OkHttp: <-- 200 OK http://192.168.1.104:9094/quotes-reactive-paged?page=3&size=20&username=demo (149ms)
    transfer-encoding: chunked
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS
    Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range
    Access-Control-Expose-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range
    Content-Type: text/event-stream
05-04 21:42:00.040 13277-13338/reactive.android.cigna.com.reactiveexample D/OkHttp: data:{"id":"1052","book":"El Quijote","content":"-¡Ta, ta! -dijo Sancho-. ¿Que la hija de Lorenzo Corchuelo es la señora Dulcinea del Toboso, llamada por otro nombre Aldonza Lorenzo?"}
    data:{"id":"1053","book":"El Quijote","content":"-Ésa es -dijo don Quijote-, y es la que merece ser señora de todo el universo."}
    data:{"id":"1068","book":"El Quijote","content":"Y, habiéndola escrito,se la leyó; que decía ansí:"}
    <-- END HTTP (10363-byte body)
05-04 21:42:00.047 13277-13277/reactive.android.cigna.com.reactiveexample I/System.out: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
05-04 21:42:09.672 13277-13282/reactive.android.cigna.com.reactiveexample I/zygote: Do partial code cache collection, code=48KB, data=47KB

C'est le modèle du côté d'Android :

public class Quote {
    public String id;
    public String content;
    public String book;
}

Du côté du serveur, c'est le modèle :

data class Quote(val id: String, val book: String, val content: String)

Il semble qu'il ne transforme pas le json en objet, mais je ne vois pas pourquoi.

UPDATE

J'ai donc ajouté @Streaming avec le @GET J'ai essayé ceci, mais Okhttp3.Responsebody ne peut pas fonctionner, car il ne compile pas.

           .subscribe(new DisposableObserver<ResponseBody>() {
                @Override
                public void onNext(ResponseBody responseBody) {

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X