【问题标题】:MSF4J POST method receiving partial dataMSF4J POST 方法接收部分数据
【发布时间】:2019-04-26 10:03:01
【问题描述】:

我是 MSF4J 的新手,我需要编写一个通过 POST 接受大型 XML 数据的 REST API。我在用 request.getMessegeBody() 获取数据的方法。我发现它现在已被弃用,但我找不到它的新版本,所以我还是决定使用它。

问题是,当我第一次向微服务发送数据时,它并没有得到全部数据。除第一个请求外,所有后续请求都将获得完整的消息正文。

当我尝试通过 ESB 传递请求时,ESB 会接收整个正文,但当它到达端点时,它将被截断。

我也尝试过从不同的休息客户端发送请求,但第一次它总是得到不完整的消息体

@POST
@Consumes({ "application/xml", "application/json", "text/xml" })
@Path("test/")
public Response getReqNotification(@Context Request request) throws Exception {
    Response.ResponseBuilder respBuilder =         
    Response.status(Response.Status.OK).entity(request);
    ByteBuf b = request.getMessageBody();
    byte[] bb = new byte[b.readableBytes()];
    b.duplicate().readBytes(bb);
    System.out.println(new String(bb));

    return respBuilder.build();
}

我希望每次发送请求时它都会打印完整的消息(大约 2000 字节长),但是当我第一次运行微服务时我只得到大约 800 字节。

我希望在这里得到帮助。我在其他地方尝试过,但 wso2 没有太多文档(⌣_⌣”)

【问题讨论】:

标签: rest post wso2 msf4j wso2msf4j


【解决方案1】:

我仍然不明白我做错了什么,但在this link 的帮助下,我设法想出了以下代码并且它工作正常。

主要问题是我现在使用request.getMessageContentStream() 而不是贬低的request.getMessageBody()

@Consumes({ "application/xml", "application/json", "text/xml" })
@Path("test/")
public Response getReqNotification(@Context Request request) throws Exception {
        Response.ResponseBuilder respBuilder =         
        Response.status(Response.Status.OK).entity(request);
        String data = "";

        BufferedInputStream bis = new BufferedInputStream(request.getMessageContentStream());
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            int d;
            while ((d = bis.read()) != -1) {
                bos.write(d);
            }
            data = bos.toString();
        } catch (IOException ex) {
                ex.printStackTrace();
        } finally {
            try {
                bos.close();
            } catch (IOException e) {
            }
        }
        System.out.println(data);
//////do stuff

        return respBuilder.build();
}

【讨论】:

  • 我记得 getMessageBody 只返回第一个块。而如果你有多个块,你就没有阅读完整的消息。
  • 哦,现在我明白了!感谢您的澄清。我真的很感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多