是否有一种Java方法将参数集合编码为URL查询组件?
是否有一个广泛使用的Java库可以做类似的事情?例如(假设使用HttpCore的对象,但任何键值映射都可以): 应产生“foo=bar&thud=grunt”是否有一种Java方法将参数集合编码为URL查询组件?,java,http,url,encoding,Java,Http,Url,Encoding,是否有一个广泛使用的Java库可以做类似的事情?例如(假设使用HttpCore的对象,但任何键值映射都可以): 应产生“foo=bar&thud=grunt” 我知道写起来并不难,但似乎应该已经写好了。我就是找不到。你真的不需要图书馆。我在HttpCore中也没有找到,所以我写了这样的东西 public String toString() { StringBuilder sb = new StringBuilder(baseUrl); char separator;
我知道写起来并不难,但似乎应该已经写好了。我就是找不到。你真的不需要图书馆。我在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和URLEncoder,它们至少会对参数列表的各个部分进行编码。我最后编写了自己的。它可以被称为
URIUtils.withQuery(uri, "param1", "value1", "param2", "value2");
这并不坏
/**
* Concatenates <code>uri</code> with a query string generated from
* <code>params</code>.
*
* @param uri the base URI
* @param params a <code>Map</code> of key/value pairs
* @return a new <code>URI</code>
*/
public static URI withQuery(URI uri, Map<String, String> params) {
StringBuilder query = new StringBuilder();
char separator = '?';
for (Entry<String, String> 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 <code>uri</code> with a query string generated from
* <code>params</code>. The members of <code>params</code> will be
* interpreted as {key1, val1, key2, val2}. Empty values can be given
* as <code>""</code> or <code>null</code>.
*
* @param uri the base URI
* @param params the key/value pairs in sequence
* @return a new <code>URI</code>
*/
public static URI withQuery(URI uri, String... params) {
Map<String, String> map = new LinkedHashMap<String, String>();
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);
}
为什么要重新发明轮子?已完成以下任务:
List<BasicNameValuePair> params = Arrays.asList(new BasicNameValuePair("\\%^ &=@#:", "\\%^ &=@#:"));
String query = URLEncodedUtils.format(params, "UTF-8");
List params=Arrays.asList(新的BasicNameValuePair(“\\%^&=@\\\:”,“\\%^&=@\\:”);
字符串查询=URLEncodedUtils.format(参数“UTF-8”);
有很多库可以帮助您构建URI(不要重新发明轮子)。以下是一个让您开始学习的方法:
另请参见:事实证明,HttpParams并不像我写这个问题时所想的那样。请不要发布--。相反,如果你认为这个问题是重复的,就把它标记为重复的。
List<BasicNameValuePair> params = Arrays.asList(new BasicNameValuePair("\\%^ &=@#:", "\\%^ &=@#:"));
String query = URLEncodedUtils.format(params, "UTF-8");
import org.springframework.web.util.UriComponentsBuilder;
...
return UriComponentsBuilder.fromUriString(url).queryParam(key, value).build().toUri();