MSF4J POST метод получения частичных данных - PullRequest
1 голос
/ 26 апреля 2019

Я новичок в MSF4J, и мне нужно написать REST API, который принимает большие XML-данные через POST. я использую 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 не так много документации (⌣_⌣ ”)

1 Ответ

0 голосов
/ 30 апреля 2019

Я до сих пор не совсем понимаю, что я делал неправильно, но с помощью этой ссылки мне удалось придумать следующий код, и он отлично работает.

Основное значение в том, что теперь я использую 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();
}
...