开发者

How to append URL in java [duplicate]

This question already has answers here: 开发者_如何学编程 What is the idiomatic way to compose a URL or URI in Java? (7 answers) Closed 6 years ago.

Do you know any JDK service in Java 1.5 that knows to take care of URL appending? (taking care of putting "?" or "&" depends on the fact that the query param is the first one or not).

Thanks, Shay


This simple class for building URL saves me a lot of time:

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();
    }
}

Usage is very simple:

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

Hope this helps.


A rather straightforward example (and very similar to Noel M's example who posted his while I was writing this) would be:

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();


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();
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜