java - 使用 retrofit2 和 RxAndroid 从 Spring WebFlux 获取响应

标签 java kotlin retrofit2 rx-android spring-webflux

我不确定如何设置 android 端来反序列化它。

这是我在服务器上的定义:

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

在 android 端我有这个来获得响应:

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

这是我用来处理的内容:

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");
                }
            })

这是一个响应的例子,由 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?"}

这是我在 logcat 中得到的,但我确实删除了一些数据元素。

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

这是android端的模型:

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

在服务器端这是模型:

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

它似乎没有将 json 转换为对象,但我不明白为什么。

更新

所以我添加了 @Streaming@GET 并尝试了这个,但是 Okhttp3.Responsebody 无法工作,因为它不会编译。

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

最佳答案

我没有使用过 flux,但你发送了一个格式错误的 JSON,它需要一个 Quote对象,所以它应该以 { 开头.

你正在发送一个列表,所以你应该把你的界面改成类似的东西

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

现在我不记得 Rx 是否适用于 List<> .

无论如何它都不会工作,因为列表以 [ 开头,因此更改您的服务以正确格式化响应并使您的 Rx 接口(interface)适应您期望接收的任何内容。

关于java - 使用 retrofit2 和 RxAndroid 从 Spring WebFlux 获取响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50183487/

相关文章:

android - 指令 'monitor-enter v1' 期间出现空指针异常

java - JFormattedTextField 删除用户输入

java - 是否需要不基于 Spring/Tomcat 的 Java 7 云服务器框架?

java - 如何在java中将数组的一部分作为函数参数传递?

dependency-injection - 在 Kodein 依赖注入(inject)中,如何将 Kodein 本身的实例注入(inject)到实例中?

android - 如何使用rx和kotlin对远程服务一一进行请求调用?

android - 使 RxJava 异步任务线程安全

java - 通过 Smack android api 添加新用户到 ejabberd

android - Kotlin扩展函数: unresolved reference

api - 如何在Retrofit2中使用协程?