使用reactor-netty处理分块响应中的每个块数据的正确方法是什么?

时间:2018-03-29 06:17:27

标签: reactor-netty

我正在使用API​​服务器通过使用无限的分块响应来实现“服务器推送”功能。响应中的每个块表示推送到客户端的消息服务器。每个块实际上都是一个完整的json对象。这是我用作接收推送到的消息服务器的客户端的代码。

Flux<JSONObject> jsonObjectFlux = client
        .post(uriBuilder.expand("/data/long_poll").toString(), request -> {
          String pollingRequest = createPollingRequest();
          return request
              .failOnClientError(false)
              .failOnServerError(false)
              .addHeader("Authorization", host.getToken())
              .addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
              .addHeader(HttpHeaders.CONTENT_LENGTH,
                  String.valueOf(ByteBufUtil.utf8Bytes(pollingRequest)))
              .sendString(Mono.just(pollingRequest));
        }).flatMapMany(response -> response.receiveContent().map(httpContent -> {
          ByteBuf byteBuf = httpContent.content();
          String source = new String(ByteBufUtil.getBytes(byteBuf), Charsets.UTF_8);
          return new JSONObject(source);
        }));
    jsonObjectFlux.subscribe(jsonObject -> {
      logger.debug("JSON: {}", jsonObject);
    });

但是我得到了例外:

reactor.core.Exceptions$ErrorCallbackNotImplemented: org.json.JSONException: Unterminated string at 846 [character 847 line 1]
Caused by: org.json.JSONException: Unterminated string at 846 [character 847 line 1]
    at org.json.JSONTokener.syntaxError(JSONTokener.java:433)
    at org.json.JSONTokener.nextString(JSONTokener.java:260)
    at org.json.JSONTokener.nextValue(JSONTokener.java:360)
    at org.json.JSONObject.<init>(JSONObject.java:214)
    at org.json.JSONTokener.nextValue(JSONTokener.java:363)
    at org.json.JSONObject.<init>(JSONObject.java:214)

显然,我没有得到一个完整的json数据。我想知道使用response.receiveContent()是否是处理一个块数据的正确方法。

0 个答案:

没有答案