Кодировать параметры GET на URL - PullRequest
0 голосов
/ 04 июля 2018

Я сделал этот код, который хорошо работает, но я уверен, что существует что-то более чистое и легче для чтения

    public static String get(String url, HashMap<String, Object> args){
        if(!url.endsWith("/")) url+="/";
        args.keySet().forEach(k -> {
            try {
                args.replace(k, URLEncoder.encode(args.get(k).toString(), "UTF-8"));
            }catch (Exception ex){}
        });
        if(!args.isEmpty()){
            url+="?";
            for(Map.Entry<String, Object> arg : args.entrySet()){
                url+=arg.getKey()+"="+arg.getValue()+"&";
            }
            url = url.substring(0, url.length()-1);
        }
        return url;
    }

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Прежде всего, не пытайтесь изобретать велосипед . Создание URI с параметрами запроса является очень распространенным требованием, поэтому я настоятельно рекомендую вам использовать проверенное и надежное решение, а не писать свое собственное.

Позвольте мне немного расширить ответ , опубликованный Ян Хроник . В зависимости от стека, который вы используете в своем приложении, вы можете выбрать один из следующих подходов:

UriBuilder от JAX-RS (представлен в Java EE 6)

public static String buildUri(String baseUri, Map<String, Object> queryParams) {
    UriBuilder builder = UriBuilder.fromUri(baseUri);
    queryParams.forEach((key, value) -> builder.queryParam(key, value.toString()));
    return builder.toString();
}

UriComponentsBuilder от весны

public static String buildUri(String baseUri, Map<String, Object> queryParams) {
    UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(baseUri);
    queryParams.forEach((key, value) -> builder.queryParam(key, value.toString()));
    return builder.toUriString();
}

URIBuilder от Apache HTTP Components

public static String buildUri(String baseUri, Map<String, Object> queryParams) 
    throws URISyntaxException {
    URIBuilder builder = new URIBuilder(baseUri);
    queryParams.forEach((key, value) -> builder.addParameter(key, value.toString()));
    return builder.toString();
}
0 голосов
/ 05 июля 2018

Вы можете использовать JAX-RS UriBuilder :

public static String get(String url, Map<String, Object> args) {
    UriBuilder builder = UriBuilder.fromUri(url);
    args.entrySet().forEach(e -> builder.queryParam(e.getKey(), e.getValue()));
    return builder.toString();
}

В качестве альтернативы вы можете взглянуть на URIBuilder от Apache.

...