完全无法读取vertx路由处理程序链中的发布数据-尝试所有方法均未成功

时间:2018-09-03 22:42:21

标签: groovy vert.x httphandler

我正在使用vertx web运行gradle构建。我的图书馆信物包括

[
    {
        'ip': '127.0.0.1',
        'hostname': 'abc',
        'state': '(2:open) != (3:closed)'
    },
    {
        'ip': '127.0.0.2',
        'hostname': '(2:bca) != (3:xxx)',
        'state': '(2:closed) != (3:up)'
    },
    {
        'ip': '127.0.0.3',
        'hostname': '(2:NOT EXIST) != (3:qwe)',
        'state': '(2:NOT EXIST) != (3:open)'
    }
]

所以在我的常规脚本代码中,我这样做

   // 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()  
...

我在路由的一般处理程序之前为BodyHandling创建处理程序。

然后我用路由启动服务器

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
    }

}

可以很好地处理邮递员的获取请求。

当我使用带有请求正文数据的发布请求时-服务挂起,我必须取消-它永远不会进入switch语句。当我发布帖子时,控制台中发生的所有事情都是

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

这是最接近相关主题enter link description here

我现在已经尝试了无数种方法,当我收到请求时将bodyHandler设置在请求中,等等-无法使其正常工作。

我的邮递员帖子看起来像这样-标题设置为Content-Type application / json,Content-Length为296字节(utf16中为字节长度),Accept为文本/纯文本,以接收简单响应

enter image description here 该文档只是不清楚。吹了12个小时才试图破解。

请问有人确切知道在使用vertx网站时应如何获取请求中的帖子数据

1 个答案:

答案 0 :(得分:0)

似乎我的问题是正在发送的字节大小。我已经计算出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:“链接处理程序,但将主体处理程序放在第一位”

//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 ->...

感谢Homerman的答复-但这是设置内容长度的问题,假设内部字节大小为UTF16是真正的问题。现在回到尝试完成我打算做的事情