代码之家  ›  专栏  ›  技术社区  ›  Steven Huwig

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

  •  7
  • Steven Huwig  · 技术社区  · 15 年前

    有一个广泛使用的Java库吗? dojo.objectToQuery() 做?例如(假设使用httpcore的 HttpParams 对象,但任何键值映射都可以:

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

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

    我知道写起来并不难,但看起来应该已经写了。我就是找不到。

    5 回复  |  直到 8 年前
        1
  •  11
  •   Sergiu Dumitriu    11 年前

    为什么要重新发明轮子? Apache HttpClient 有urlencodedutils:

       List<BasicNameValuePair> params = Arrays.asList(new BasicNameValuePair("\\%^ &=@#:", "\\%^ &=@#:"));
       String query = URLEncodedUtils.format(params, "UTF-8");
    
        2
  •  5
  •   Steven Huwig    15 年前

    最后我自己写了。可以这样叫

    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);
    }
    
        3
  •  5
  •   informatik01 Viswanath Lekshmanan    10 年前

    你真的不需要图书馆。我也没有在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();
    }
    
        4
  •  1
  •   Kathy Van Stone    15 年前

    如果您有JAX-RS,那么就有javax.ws.rs.core.uribuilder;除此之外,您应该主要了解URLEncoder和URLDecoder,它们至少会对参数列表的各个部分进行编码。

        5
  •  0
  •   Nick Grealy    8 年前

    有很多库可以帮助您构建URI(不要重新设计方向盘)。这是一个让你开始的方法:


    org.springframework:spring-web:4.2.5.RELEASE

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

    另请参见: GIST > URI Builder Tests