是否有一种Java方法将参数集合编码为URL查询组件?

有没有广泛使用的Java库可以执行类似dojo.objectToQuery()的操作? 例如(假设使用HttpCore的HttpParams对象,但任何键值映射都会这样做):

HttpParams params = new BasicHttpParams() .setParameter("foo", "bar") .setParameter("thud", "grunt"); UnknownLibrary.toQueryString(params); 

应该产生“foo = bar&thud = grunt”。

我知道写起来并不难,但似乎应该已经写好了。 我找不到它。

为什么重新发明轮子? Apache HttpClient具有URLEncodedUtils:

  List params = Arrays.asList(new BasicNameValuePair("\\%^ &=@#:", "\\%^ &=@#:")); String query = URLEncodedUtils.format(params, "UTF-8"); 

我最后写了自己的。 它可以被称为

 URIUtils.withQuery(uri, "param1", "value1", "param2", "value2"); 

这不是那么糟糕。

 /** * Concatenates uri with a query string generated from * params. * * @param uri the base URI * @param params a Map of key/value pairs * @return a new URI */ public static URI withQuery(URI uri, Map params) { StringBuilder query = new StringBuilder(); char separator = '?'; for (Entry param : params.entrySet()) { query.append(separator); separator = '&'; try { query.append(URLEncoder.encode(param.getKey(), "UTF-8")); if (!StringUtils.isEmpty(param.getValue())) { query.append('='); query.append(URLEncoder.encode(param.getValue(), "UTF-8")); } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } return URI.create(uri.toString() + query.toString()); } /** * Concatenates uri with a query string generated from * params. The members of params will be * interpreted as {key1, val1, key2, val2}. Empty values can be given * as "" or null. * * @param uri the base URI * @param params the key/value pairs in sequence * @return a new URI */ public static URI withQuery(URI uri, String... params) { Map map = new LinkedHashMap(); for (int i = 0; i < params.length; i += 2) { String key = params[i]; String val = i + 1 < params.length ? params[i + 1] : ""; map.put(key, val); } return withQuery(uri, map); } 

你真的不需要一个库。 我在HttpCore中找不到一个,所以我写了这样的东西,

 public String toString() { StringBuilder sb = new StringBuilder(baseUrl); char separator; if (baseUrl.indexOf('?') > 0) separator = '&'; else separator = '?'; for (Parameter p : parameters) { sb.append(separator); try { sb.append(URLEncoder.encode(p.name, "UTF-8")); if (p.value != null) { sb.append('='); sb.append(URLEncoder.encode(p.value, "UTF-8")); } } catch (UnsupportedEncodingException e) { // Not really possible, throw unchecked exception throw new IllegalStateException("No UTF-8"); } separator = '&'; } return sb.toString(); } 

如果你有JAX-RS,那就是javax.ws.rs.core.UriBuilder; 除此之外,您应该首先了解URLEncoder和URLDecoder,它至少会编码参数列表的各个部分。

有很多库可以帮助您构建URI(不要重新发明轮子)。 这是一个让你入门:


org.springframework:弹簧网:4.2.5.RELEASE

 import org.springframework.web.util.UriComponentsBuilder; ... return UriComponentsBuilder.fromUriString(url).queryParam(key, value).build().toUri(); 

另请参见: GIST> URI Builder测试