
net.dongliu.requests.utils.URLUtils Maven / Gradle / Ivy
The newest version!
package net.dongliu.requests.utils;
import net.dongliu.requests.Parameter;
import net.dongliu.requests.exception.RequestsException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* Util methods for encode / decode uri.
*/
public class URLUtils {
/**
* Encode key-value form parameter
*/
public static String encodeForm(Parameter query, Charset charset) {
try {
return URLEncoder.encode(query.name(), charset.name()) + "=" + URLEncoder.encode(query.value(),
charset.name());
} catch (UnsupportedEncodingException e) {
// should not happen
throw new RequestsException(e);
}
}
/**
* Encode multi form parameters
*/
public static String encodeForms(Collection extends Parameter> queries, Charset charset) {
StringBuilder sb = new StringBuilder();
try {
for (Parameter query : queries) {
sb.append(URLEncoder.encode(query.name(), charset.name()));
sb.append('=');
sb.append(URLEncoder.encode(query.value(), charset.name()));
sb.append('&');
}
} catch (UnsupportedEncodingException e) {
// should not happen
throw new RequestsException(e);
}
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
/**
* Decode key-value query parameter
*/
public static Parameter decodeForm(String s, Charset charset) {
int idx = s.indexOf("=");
try {
if (idx < 0) {
return Parameter.of("", URLDecoder.decode(s, charset.name()));
}
return Parameter.of(URLDecoder.decode(s.substring(0, idx), charset.name()),
URLDecoder.decode(s.substring(idx + 1), charset.name()));
} catch (UnsupportedEncodingException e) {
// should not happen
throw new RequestsException(e);
}
}
/**
* Parse query params
*/
public static List> decodeForms(String queryStr, Charset charset) {
String[] queries = queryStr.split("&");
List> list = new ArrayList<>(queries.length);
for (String query : queries) {
list.add(decodeForm(query, charset));
}
return list;
}
public static List> toStringParameters(Collection extends Map.Entry> params) {
List> parameters = new ArrayList<>(params.size());
for (Map.Entry entry : params) {
parameters.add(Parameter.of(entry.getKey(), String.valueOf(entry.getValue())));
}
return parameters;
}
public static URL joinUrl(URL url, Collection extends Parameter> params, Charset charset) {
if (params.isEmpty()) {
return url;
}
StringBuilder sb = new StringBuilder();
sb.append(url.getProtocol()).append(':');
if (url.getAuthority() != null && !url.getAuthority().isEmpty()) {
sb.append("//").append(url.getAuthority());
}
if (url.getPath() != null) {
sb.append(url.getPath());
}
String query = url.getQuery();
String newQuery = encodeForms(params, charset);
if (query == null || query.isEmpty()) {
sb.append('?').append(newQuery);
} else {
sb.append('?').append(query).append('&').append(newQuery);
}
if (url.getRef() != null) {
sb.append('#').append(url.getRef());
}
URL fullURL;
try {
fullURL = new URL(sb.toString());
} catch (MalformedURLException e) {
throw new RequestsException(e);
}
return fullURL;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy