2010-07-15 6 views
2

Connaissez-vous un service JDK dans Java 1.5 qui sait prendre en charge l'ajout d'URL? (prendre soin de mettre "?" ou "&" dépend du fait que la requête param est la première ou non).Comment ajouter une URL dans java

Merci, Shay

+0

Je doute que vous trouverez un service pour cela. L'implémentation de ceci est assez triviale. –

+2

Pas une partie standard du JDK, mais [cette question précédente] (http://stackoverflow.com/questions/883136/is-there-a-good-url-builder-for-java) offre une réponse sur l'utilisation d'Apache HTTPClient pour la construction d'URL. – mikej

Répondre

1

Un peu d'exemple simple (et très similaire à l'exemple de Noel M qui a affiché son pendant que je rédigeais ce) serait:

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

Cette classe simple pour construction de l'URL me fait gagner beaucoup de temps:

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

L'utilisation est très simple :

new LinkBuilder() 
    .scheme("http") 
    .host("stackoverflow.com") 
    .path("https://stackoverflow.com/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 

Espérons que cela aide.

Questions connexes