Groovy 在vertx路由处理程序链中读取post数据完全失败-尝试了所有方法均未成功

Groovy 在vertx路由处理程序链中读取post数据完全失败-尝试了所有方法均未成功,groovy,vert.x,httphandler,Groovy,Vert.x,Httphandler,我正在用VertxWeb运行gradle构建。我对图书馆的依赖包括 // 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'

我正在用VertxWeb运行gradle构建。我对图书馆的依赖包括

   // 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'
所以在我的groovy脚本代码中,我做到了这一点

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
    }

}
在路线中的常规处理程序之前,我创建了一个车身处理程序

然后我用路由启动服务器

server.requestHandler(allRouter.&accept)
server.listen(8081, "localhost")
对于邮递员的get请求,一切正常

当我使用带有请求主体数据的post请求时(服务挂起,我必须取消),它永远不会到达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,当我得到它时,等等-无法让它工作

我的postman帖子如下所示-其中标题设置为Content-Type-application/json,内容长度为296字节(utf16中的字节长度),Accept为text/plain以接收简单响应

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
    }

}
文件只是不清楚。为了破解这道题花了12个小时


有人知道在使用Vertex web时如何获得请求的post数据吗请

似乎我的问题是发送的字节大小。我已经将reqBody字符串的字节计算为296字节(使用UTF16字符集),并将其设置到Postman请求中

因此,vertx服务器在处理尸体和吊死时试图读取那么多。当我刚刚执行reqBody.getBytes().size(有效的UTF8)时,返回了147个字节。当我在《邮递员》中将内容长度更改为这一长度时,它开始起作用

设置BodyHandler时存在计时问题。我试过这是在开关箱中,但它失败了,请求已经被读取

然而,这两种方法似乎都没有成功

选项1:'在路由(路径)调用之前创建正文处理程序'

选项2:'链接处理程序,但将主体处理程序放在第一位'

//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,这才是真正的问题。现在回到我开始做的事情。

hmmm。。。是否在安装
BodyHandler
之前,正在处理路线?在创建路由之前,您是否尝试过安装路由器?如果没有,请尝试删除现有行以创建
BodyHandler
,并在
allRouter.route(.handler.create())
之前添加
allRouter.route(“/api/now/table/incident”)
。我尝试过了,但问题相同。但我和你一样在睡梦中一夜之间出现了脑电波。邮递员被吊死了,我没能正确地找到拦阻处理器。因此,我最初将post请求上下文块评估为reqBody.getBytes(charset.forname(“utf16”)).size()——即296位。所以我只是简单地修改了reqBody.getBytes().size(),它是147字节。当我把邮递员改为说内容长度是147时,它开始起作用了。