有没有编码的参数集合作为一个网址查询组件的Java方法?(Is there a Java metho

2019-07-17 15:27发布

有没有做什么像什么一种广泛使用的Java库dojo.objectToQuery()呢? 例如(假设使用的HttpCore年代的HttpParams对象,但任何键-值映射就能做到):

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

应产生为“foo =栏&扑扇=咕噜”。

我知道这并不难写,但它似乎像它应该已经被写入。 我只是无法找到它。

Answer 1:

为什么要推倒重来? 阿帕奇的HttpClient有URLEncodedUtils:

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


Answer 2:

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

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


Answer 3:

你并不真的需要一个库。 我没有找到一个在任的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();
}


Answer 4:

如果您有JAX-RS有javax.ws.rs.core.UriBuilder; 除此之外,你应该首先知道的URLEncoder和URLDecoder将至少编码参数列表的作品。



Answer 5:

有很多库,可以帮助您与URI建筑(不重新发明轮子)的。 这是一个让你开始:


org.springframework:弹簧网:4.2.5.RELEASE

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

另请参见: GIST> URI生成器测试



文章来源: Is there a Java method that encodes a collection of parameters as a URL query component?