当前位置: 首页 > 知识库问答 >
问题:

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

郑景胜
2023-03-14

我正在用vertx web运行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'

所以在我时髦的脚本代码中,我这样做

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")

对于邮递员的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

这是最接近相关主题的,请在此处输入链接描述

我已经尝试了无数的方法,现在,当我得到它等时,在请求内设置body Handler-无法让它工作。

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

请问有谁确切地知道在使用vertx web时应该如何获得请求的post数据

共有1个答案

蒲坚
2023-03-14

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

所以vertx服务器在处理正文时试图读取这么多并挂起。当我刚刚执行reqBody.getBytes(). size-有效地是UTF8时,它返回了147个字节。当我在postman中将内容长度更改为this时,它开始工作。

设置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 ->...

这是设置内容长度,假设内部字节大小为UTF16,这才是真正的问题。现在回到我开始做的事情。

 类似资料:
  • 我试着体验SmallRye Mutiny Vertx绑定,完整的示例代码可以在我的Github上找到。 当装配这样的路线时。 将阻止请求。

  • 但我想知道是否有一种方法可以先定义公共处理程序,然后一些路由可以定义另一个处理程序。谢谢

  • 我有一个关于CompletableFuture方法的问题: JavaDoc的意思是: 返回一个新的完成阶段,当此阶段正常完成时,将使用此阶段的结果作为所提供函数的参数来执行该阶段。有关异常完成的规则,请参阅完成阶段文档。 穿线呢?这将在哪个线程中执行?如果未来由线程池来完成呢?

  • 在执行Cassandra操作(批量执行-在两个表上插入和更新操作)时,我收到“所有主机都尝试查询失败-com。数据。驱动程序。核心。操作时间异常”错误。 群集信息: 卡桑德拉 2.1.8.621 |DSE 4.7.1 火花-卡桑德拉-连接器-java_2.10 版本 - 1.2.0-rc1 | 卡桑德拉驱动器核心版本 - 2.1.7 火花 1.2.1 |Hadoop 2.7.1 = 在搜索它的解决

  • 我正在使用一个Selenium/JUnit测试环境,我想实现一个类来执行“软断言”:这意味着我想让它记录断言是否通过,但在明确地告诉它验证断言之前,测试用例不会失败。这样,我可以检查页面上的多个字段,记录所有不匹配的字段。 我的“Verify”方法如下所示(/也存在类似的方法): 一旦验证了所有字段,我就调用以下方法: 目前,我只是使用来快速使测试用例失败;然而,这会使日志变得杂乱无章,导致一个无