【问题标题】:How to append URL in java [duplicate]如何在java中附加URL [重复]
【发布时间】:2011-03-16 05:56:44
【问题描述】:

您知道 Java 1.5 中的任何 JDK 服务知道处理 URL 附加吗? (注意放置“?”或“&”取决于查询参数是否是第一个事实)。

谢谢, 谢伊

【问题讨论】:

  • 我怀疑你会为此找到服务。这个实现非常简单。
  • 不是 JDK 的标准部分,但this previous question 提供了使用 Apache HTTPClient 构建 URL 的答案。

标签: java url append


【解决方案1】:

这个用于构建 URL 的简单类为我节省了大量时间:

public class LinkBuilder {

    protected String scheme;
    protected String host;
    protected int port;
    protected Map<String, String> args = new HashMap<String, String>();
    protected String path;
    protected String hash;

    public LinkBuilder() {
        this(null, null, 0, new HashMap<String, String>(), null, null);
    }

    protected LinkBuilder(LinkBuilder other) {
        this.scheme = other.scheme;
        this.host = other.host;
        this.port = other.port;
        this.args = new HashMap<String, String>();
        if (other.args != null) {
            this.args.putAll(other.args);
        }
        this.path = other.path;
        this.hash = other.hash;
    }

    protected LinkBuilder(String schema, String host, int port, Map<String, String> args, String path, String hash) {
        this.scheme = schema;
        this.host = host;
        this.port = port;
        this.args = new HashMap<String, String>();
        if (args != null) {
            this.args.putAll(args);
        }
        this.path = path;
        this.hash = hash;
    }

    public LinkBuilder(URI url) {
        String query = url.getRawQuery();
        if (query != null) {
            for (String argLine : query.split("&")) {
                if (argLine.length() > 0) {
                    int i = argLine.indexOf('=');
                    if (i != -1) {
                        args.put(argLine.substring(0, i), argLine.substring(i + 1));
                    }
                    else {
                        args.put(argLine, null);
                    }
                }
            }
        }
        this.scheme = url.getScheme();
        this.host = url.getHost();
        this.port = url.getPort();
        this.path = url.getRawPath();
        this.hash = url.getRawFragment();
    }

    public LinkBuilder url(URI url) {
        return new LinkBuilder(url);
    }

    public LinkBuilder scheme(String schema) {
        return new LinkBuilder(schema, host, port, args, path, hash);
    }

    public LinkBuilder host(String host) {
        if (host.indexOf('/') != -1) {
            throw new IllegalArgumentException("Wrong host name: " + host);
        }
        return new LinkBuilder(scheme, host, port, args, path, hash);
    }

    public LinkBuilder port(int port) {
        return new LinkBuilder(scheme, host, port, args, path, hash);
    }

    public LinkBuilder hash(String hash) {
        return new LinkBuilder(scheme, host, port, args, path, hash);
    }

    public LinkBuilder path(String path) {
        return new LinkBuilder(scheme, host, port, args, path, hash);
    }

    public LinkBuilder arg(String name) {
        return arg(name, null);
    }

    public LinkBuilder arg(String name, Object value) {
        Map<String, String> newArgs = new HashMap<String, String>(args);
        newArgs.put(name, value == null ? null : value.toString());
        return new LinkBuilder(scheme, host, port, newArgs, path, hash);
    }

    public String build() {
        StringBuilder buf = new StringBuilder();
        if (scheme != null) {
            buf.append(scheme);
        }
        buf.append("://");
        if (host != null) {
            buf.append(host);
        }
        if (port > 0 && !"https".equals(scheme)) {
            buf.append(':').append(port);
        }
        if (path != null) {
            if (path.charAt(0) != '/') {
                buf.append('/');
            }
            buf.append(path);
        }
        else if (args.size() > 0 || hash != null) {
            buf.append('/');
        }
        if (args.size() > 0) {
            buf.append('?');
            boolean first = true;
            for (Entry<String, String> arg : args.entrySet()) {
                if (!first) {
                    buf.append('&');
                }
                else {
                    first = false;
                }
                buf.append(URLEncoder.encode(arg.getKey(), "UTF-8"));
                if (arg.getValue() != null && arg.getValue().length() > 0) {
                    buf.append("=").append(URLEncoder.encode(arg.getValue(), "UTF-8"));
                }
            }
        }
        if (hash != null) {
            buf.append('#').append(hash);
        }
        return buf.toString();
    }

    public String toString() {
        return build();
    }
}

用法很简单:

new LinkBuilder()
   .scheme("http")
   .host("stackoverflow.com")
   .path("/questions/3253058/how-to-append-url-in-java/3253350")
   .hash("3253350")
   .build(); // Generates link to this post

new LinkBuilder(new URI("http://www.google.com/search"))
   .arg("q", "Bugs Bunny")
   .arg("ie", "UTF-8")
   .build(); // Results in http://www.google.com/search?q=Bugs+Bunny&ie=UTF-8

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    一个相当简单的例子(和我写这篇文章时发布的 Noel M 的例子非常相似)是:

    StringBuilder sb = new StringBuilder(url);
    url.indexOf("?") > -1 ? sb.append("&") : sb.append("?");
    
    // loop over your paramaters and append them like in Noel M's example
    
    url = sb.toString();
    

    【讨论】:

      【解决方案3】:
      public String buildUrl(String url, List<String> params) {
          StringBuilder builder = new StringBuilder(url);
          if(params != null && params.size() > 0) {
              builder.append("?");
      
              for(Iterator<String> i = params.iterator(); i.hasNext();) {
                  String s = i.next();
                  builder.append(s);
                  if(i.hasNext()) {
                      builder.append("&");
                  }
              }
          }
      
          return builder.toString();
      }
      

      【讨论】:

        猜你喜欢
        • 2019-08-22
        • 2014-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-06
        • 2014-09-27
        相关资源
        最近更新 更多