我正在使用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为文本/纯文本,以接收简单响应
请问有人确切知道在使用vertx网站时应如何获取请求中的帖子数据
答案 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是真正的问题。现在回到尝试完成我打算做的事情