All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.gjing.UrlUtil Maven / Gradle / Ivy

The newest version!
package cn.gjing;

import org.springframework.util.MultiValueMap;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author Gjing
 **/
public class UrlUtil {
    /**
     * url拼接:其结果为:http://127.0.0.1:8080/test?param1={param1},这种格式会出现在restTemplate请求的get方法中
     *
     * @param map 参数
     * @param url 需要拼接的url 例如:http://127.0.0.1:8080/test,需要尾随方法名
     * @return 拼接完后的url
     */
    static String urlAppend(String url, MultiValueMap map) {
        StringBuilder builder = new StringBuilder();
        int len = url.indexOf("?", url.length() - 1);
        if (len == -1) {
            builder.append(url).append("?");
        } else {
            builder.append(url);
        }
        for (String s : map.keySet()) {
            if (map.size() == 1) {
                builder.append(s).append("=").append("{").append(s).append("}");
            } else {
                builder.append(s).append("=").append("{").append(s).append("}&");
            }
        }
        if (map.size() == 1) {
            return builder.toString();
        } else {
            return builder.toString().substring(0, builder.toString().length() - 1);
        }
    }

    /**
     * url拼接:其结果为:http://127.0.0.1:8080/test?param1={param1}
     *
     * @param map 参数
     * @param url 需要拼接的url 例如:http://127.0.0.1:8080/test,需要尾随方法名
     * @return 拼接完后的url
     */
    static String urlAppend(String url, Map map) {
        StringBuilder builder = new StringBuilder();
        int len = url.indexOf("?", url.length() - 1);
        if (len == -1) {
            builder.append(url).append("?");
        } else {
            builder.append(url);
        }
        for (String s : map.keySet()) {
            if (map.size() == 1) {
                builder.append(s).append("=").append("{").append(s).append("}");
            } else {
                builder.append(s).append("=").append("{").append(s).append("}&");
            }
        }
        if (map.size() == 1) {
            return builder.toString();
        } else {
            return builder.toString().substring(0, builder.toString().length() - 1);
        }
    }

    /**
     * 用户请求连接采用占位符的时候进行url和参数拼接,结果例子为: http://localhost:xx/test/2414/42daf
     * @param url 请求地址
     * @param params 参数
     * @return string
     */
    public static String urlAppend(String url,Object[] params) {
        StringBuilder builder = new StringBuilder(url);
        if (url.indexOf("/", url.length() - 1) == -1) {
            builder.append("/");
        }
        for (Object param : params) {
            builder.append(param).append("/");
        }
        return builder.toString();
    }


    /**
     * 参数按照字段名的Unicode码从小到大排序(字典序)
     *
     * @param paramMap   要排序的参数
     * @param urlEncode  是否需要URLEncode,true:需要/false:不需要
     * @param keyToLower 是否需要将Key转换为全小写 true:key转化成小写,false:不转化
     * @return 排序后的参数字符串
     */
    public static String paramUnicodeSort(Map paramMap, boolean urlEncode, boolean keyToLower) {
        String buff;
        try {
            List> infoIds = new ArrayList<>(paramMap.entrySet());
            // 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
            infoIds.sort(Comparator.comparing(Map.Entry::getKey));
            // 构造URL 键值对的格式
            StringBuilder buf = new StringBuilder();
            for (Map.Entry item : infoIds) {
                if (ParamUtil.isNotEmpty(item.getKey())) {
                    String key = item.getKey();
                    String val = (String) item.getValue();
                    if (urlEncode) {
                        val = URLEncoder.encode(val, "utf-8");
                    }
                    if (keyToLower) {
                        buf.append(key.toLowerCase()).append("=").append(val);
                    } else {
                        buf.append(key).append("=").append(val);
                    }
                    buf.append("&");
                }
            }
            buff = buf.toString();
            if (ParamUtil.isNotEmpty(buf)) {
                buff = buff.substring(0, buff.length() - 1);
            }
        } catch (Exception e) {
            return null;
        }
        return buff;
    }

    /**
     * 将URL中的查询参数部分解析成键值对
     *
     * @param url 将url的参数转为map
     * @return map
     */
    public static Map urlParamToMap(String url) {
        final Map queryPairs = new ConcurrentHashMap<>(16);
        final String[] param = ParamUtil.split(url, "?");
        if (ParamUtil.isEmpty(param) || param.length < 1) {
            return null;
        }
        final String[] pairs = ParamUtil.split(param[1], "&");
        if (ParamUtil.isEmpty(pairs)) {
            return null;
        }
        for (String pair : pairs) {
            final int idx = pair.indexOf("=");
            String key;
            try {
                key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair;
                final String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1),
                        "UTF-8") : null;
                if (!key.isEmpty()) {
                    queryPairs.put(key, value);
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return queryPairs;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy