полностью не удалось прочитать данные поста в цепочке обработчиков маршрутов vertx - пробовал все пути безуспешно - PullRequest
0 голосов
/ 04 сентября 2018

Я запускаю сборку Gradle с Vertx Web. мои библиотечные зависимости включают

   // for mock API serving https://mvnrepository.com/artifact/io.vertx/vertx-core
    compile group: 'io.vertx', name: 'vertx-core', version: '3.5.3'
    compile group: 'io.vertx', name: 'vertx-web', version: '3.5.3'

так что в моем отличном коде скрипта я делаю это

Vertx vertx = Vertx.vertx()
HttpServer server = vertx.createHttpServer()  
...

Затем я объявляю маршрут, чтобы перехватить все запросы к ресурсу, обработать запрос и сформировать ответ - стараясь сделать его простым - просто вернуть простую строку в качестве ответа

Router allRouter = Router.router(vertx)

allRouter.route ( "/api/now/table/incident")
        .handler(BodyHandler.create())
        .blockingHandler { routingContext ->

    def request  = routingContext.request()
    HttpMethod method = request.method()

    def response = routingContext.response()
    response.putHeader ("content-type", "text/plain")

    def uri = routingContext.request().absoluteURI()
    switch (method) {
        case HttpMethod.GET:
            println "processing a resource GET on uri : $uri "
            response.end ("(GET) howdi will")
            break

        case HttpMethod.POST:

            String bodyEnc = routingContext.getBodyAsJson().encodePrettily()

            println "processing a resource POST on uri : $uri"

            println "post request received post data : " + bodyEnc

            response.end ("(POST) howdi will")
            break
    }

}

Я создаю обработчик для BodyHandling, перед общим обработчиком в маршруте.

Затем я запускаю сервер с маршрутом

server.requestHandler(allRouter.&accept)
server.listen(8081, "localhost")

отлично работает при получении запроса от почтальона.

когда я использую почтовый запрос с данными тела запроса - служба зависает, и мне приходится отменять - она ​​никогда не попадает в оператор switch. Все, что происходит в консоли, когда я выпускаю сообщение, это

23:30:16.455 [vert.x-eventloop-thread-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxCapacityPerThread: 32768
23:30:16.455 [vert.x-eventloop-thread-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxSharedCapacityFactor: 2
23:30:16.455 [vert.x-eventloop-thread-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.linkCapacity: 16
23:30:16.455 [vert.x-eventloop-thread-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.ratio: 8
23:30:16.478 [vert.x-eventloop-thread-1] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.bytebuf.checkAccessible: true
23:30:16.482 [vert.x-eventloop-thread-1] DEBUG io.netty.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@51d486

Это тема, ближайшая к теме введите описание ссылки здесь

Я пробовал это бесчисленное множество способов сейчас, установил bodyHandler внутри запроса, когда я его получил и т. Д. - не могу заставить его работать.

мой пост почтальона выглядит следующим образом - где заголовки установлены в Content-Type application / json, Content-Length составляет 296 байтов (длина байтов в utf16), а Accept - это text / plain для получения простого ответа

enter image description here Документация просто не понятна. Взорван 12 часов, пытаясь взломать это.

Кто-нибудь точно знает, как нужно получать данные публикации по запросу при использовании vertx web, пожалуйста

1 Ответ

0 голосов
/ 04 сентября 2018

похоже, что моей проблемой был размер отправляемых байтов. Я вычислил байты строки reqBody как 296 байтов (используя кодировку UTF16) и установил это в запрос почтальона.

Так что сервер vertx пытался прочитать это много при обработке тела и завис. Когда я только что сделал reqBody.getBytes (). Size - фактически UTF8, это вернуло 147 байт. когда я изменил длину содержимого на это в почтальоне, он начал работать.

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

однако любой из них, кажется, работает успешно

вариант 1: «создать обработчик тела перед вызовом маршрута (пути)»

allRouter.route().handler(BodyHandler.create())

//now try and setup the route for API path interception
allRouter.route ( "/api/now/table/incident")
        .blockingHandler { routingContext -> ...

вариант 2: «зацепить обработчики, но сначала поместить Body Handler»

//now try and setup the route for API path interception, followed by body handler
allRouter.route ( "/api/now/table/incident")
        .handler(BodyHandler.create())
        .blockingHandler { routingContext ->...

Спасибо Гомерману за ваш ответ - но он устанавливал длину контента, предполагая, что UTF16 для внутреннего размера байта был настоящей проблемой. Теперь вернемся к попытке завершить то, что я намеревался сделать

...