【问题标题】:Encode GET parameters on URL在 URL 上编码 GET 参数
【发布时间】:2018-07-04 18:35:09
【问题描述】:

我编写的代码运行良好,但我确信存在一些最干净且更易于阅读的代码

    public static String get(String url, HashMap<String, Object> args){
        if(!url.endsWith("/")) url+="/";
        args.keySet().forEach(k -> {
            try {
                args.replace(k, URLEncoder.encode(args.get(k).toString(), "UTF-8"));
            }catch (Exception ex){}
        });
        if(!args.isEmpty()){
            url+="?";
            for(Map.Entry<String, Object> arg : args.entrySet()){
                url+=arg.getKey()+"="+arg.getValue()+"&";
            }
            url = url.substring(0, url.length()-1);
        }
        return url;
    }

【问题讨论】:

    标签: java http url get encode


    【解决方案1】:

    您可以使用 JAX-RS 的 UriBuilder:

    public static String get(String url, Map<String, Object> args) {
        UriBuilder builder = UriBuilder.fromUri(url);
        args.entrySet().forEach(e -> builder.queryParam(e.getKey(), e.getValue()));
        return builder.toString();
    }
    

    或者,您可能想查看来自 Apache 的 URIBuilder

    【讨论】:

      【解决方案2】:

      首先,不要试图重新发明轮子。在一个非常常见的需求中创建带有查询参数的 URI,因此我强烈建议您使用经过测试且受信任的解决方案,而不是编写自己的解决方案。

      让我稍微扩展一下Jan Hronik 发布的answer。根据您在应用程序中使用的堆栈,您可以采用以下方法之一:

      UriBuilder 来自 JAX-RS(在 Java EE 6 中引入)

      public static String buildUri(String baseUri, Map<String, Object> queryParams) {
          UriBuilder builder = UriBuilder.fromUri(baseUri);
          queryParams.forEach((key, value) -> builder.queryParam(key, value.toString()));
          return builder.toString();
      }
      

      UriComponentsBuilder 来自春天

      public static String buildUri(String baseUri, Map<String, Object> queryParams) {
          UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(baseUri);
          queryParams.forEach((key, value) -> builder.queryParam(key, value.toString()));
          return builder.toUriString();
      }
      

      URIBuilder 来自 Apache HTTP 组件

      public static String buildUri(String baseUri, Map<String, Object> queryParams) 
          throws URISyntaxException {
          URIBuilder builder = new URIBuilder(baseUri);
          queryParams.forEach((key, value) -> builder.addParameter(key, value.toString()));
          return builder.toString();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 2019-01-08
        • 2018-10-25
        • 2011-02-09
        • 1970-01-01
        相关资源
        最近更新 更多