【问题标题】:how to parse query argument using vertx?如何使用vertx解析查询参数?
【发布时间】:2016-10-14 05:15:21
【问题描述】:

我想检查我们是否可以使用 getparam 从下面的请求 URL 中解析 start_time 和 end_time

https://[--hostname--]/sample_app/apthroughput/getAllControllers?start_time=<start time value>&end_time=<end time value>&label=<selected label>

【问题讨论】:

    标签: java rest vert.x


    【解决方案1】:

    查询字符串的解析非常简单,除非同一查询参数有多个值。

    e.g.: https://[--hostname--]/sample_app/apthroughput/getAllControllers?type=xxx&type=yyy
    

    在这种情况下,下面的代码有助于获取 List&lt;String&gt; 中的所有参数

    answer 给出了一个想法。从中复制:

    HttpServerRequest request = RoutingContext.request();
    MultiMap params =  request.params();
    List<String> param = params.getAll("personId");
    Here you can get list of personId. URI be like
    
    localhost:8081/myApi?personId=1&personId=2&personId=3
    

    【讨论】:

      【解决方案2】:

      这是一个例子:

      public static void main(String[] args) {
      
          Vertx vertx = Vertx.vertx();
      
          HttpServer server = vertx.createHttpServer();
      
          server.requestHandler(request -> {
      
              String startTime = request.getParam("start_time");
              String endTime = request.getParam("end_time");
      
              // This handler gets called for each request that arrives on the server
              HttpServerResponse response = request.response();
              response.putHeader("content-type", "text/plain");
      
              // Write to the response and end it
              response.end(String.format("Got start time %s, end time %s", startTime, endTime));
          });
      
          server.listen(8888);
      }
      

      打开http://localhost:8888/?start_time=20161014&end_time=20161015查看结果。

      【讨论】:

      • 我做了同样的事情,但 request.getParam("end_time") 返回 null。我试图打印 request.query() 来检查所有传递的参数,但它只打印 start_time。知道可能是什么原因吗?
      • 可能是格式错误的参数名称。您的完整网址现在是什么样的?
      • https://[--hostname--]/acp_sample_app/throughput/getAll?start_time=&end_time=&label=
      • http://localhost:10210/acp_sample_app/throughput/getAll?start_time=1234567&amp;end_time=12345678&amp;label=123 。还有我正在使用的路径 router.route("/sample_app/throughput/getall).handler(...)
      • 很高兴听到。请标记正确答案,以便其他 Vertx 用户重复使用。
      【解决方案3】:

      可以获取参数String表示,但需要自己转换值。

      【讨论】:

      • 你能帮我处理 router.route 处理程序吗?
      【解决方案4】:

      我知道这是(有点)迟到的响应,但在 Vert.X 3.9 中获取 start_timeend_time 参数,您可以通过以下方式获取它们:

      public void getAllControllersHandler(RoutingContext context) {
         Mutlimap parameters = context.request().params();
         String start_time = parameters.get("start_time");
         String end_time = parameters.get("end_time");
         // now do what you need to with retrieved values :)
      }
      

      此外,当您将端点传递给 Route get() 时,端点必须看起来像这样(我假设您使用的是 HTTP Get 方法):

      Router router = Router.router(vertx);
      router.get("/sample_app/apthroughput/getAllControllers").handler(this::getAllControllersHandler);
      

      希望对你有帮助。

      P.S.如果这解决了问题,请将其标记为已接受的答案。

      【讨论】:

        【解决方案5】:

        @OrkunOzen 的回答很好,但 MultiMap 使用不区分大小写的键。

        想要更精准的控制,可以深入代码找到这个从HttpServerRequest.params()调用的util函数-> io.vertx.core.http.impl.HttpUtils.params(String uri)

        此代码将让您完全控制:

        QueryStringDecoder queryStringDecoder = new QueryStringDecoder(uri);
        Map<String, List<String>> prms = queryStringDecoder.parameters();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-13
          • 1970-01-01
          • 1970-01-01
          • 2011-07-11
          相关资源
          最近更新 更多