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

dev.utils.common.HttpParamsUtils Maven / Gradle / Ivy

package dev.utils.common;

import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;

import dev.utils.DevFinal;
import dev.utils.JCLogUtils;

/**
 * detail: Http 参数工具类
 * @author Ttt
 */
public final class HttpParamsUtils {

    private HttpParamsUtils() {
    }

    // 日志 TAG
    private static final String TAG = HttpParamsUtils.class.getSimpleName();

    /**
     * 获取 Url 携带参数
     * @param url URL 链接
     * @return Url 携带参数
     */
    public static String getUrlParams(final String url) {
        return getUrlParamsArray(url)[1];
    }

    /**
     * 获取 Url、携带参数 数组
     * @param url URL 链接
     * @return 0 = url, 1 = params
     */
    public static String[] getUrlParamsArray(final String url) {
        String[] result = new String[2];
        if (StringUtils.isNotEmpty(url)) {
            // 清除掉前后空格
            String urlClean = StringUtils.clearSEWiths(url, " ");
            // 清除掉结尾的 ?
            urlClean = StringUtils.clearEndsWith(urlClean, "?");
            // 进行拆分
            int index = urlClean.indexOf("?");
            if (index != -1) {
                result[0] = urlClean.substring(0, index);
                result[1] = urlClean.substring(index + 1);
            } else {
                result[0] = urlClean;
            }
        }
        return result;
    }

    /**
     * 判断是否存在参数
     * @param params 请求参数字符串
     * @return {@code true} yes, {@code false} no
     */
    public static boolean existsParams(final String params) {
        return !splitParams(params).isEmpty();
    }

    /**
     * 通过 Url 判断是否存在参数
     * @param url URL 链接
     * @return {@code true} yes, {@code false} no
     */
    public static boolean existsParamsByURL(final String url) {
        return !splitParams(getUrlParams(url)).isEmpty();
    }

    /**
     * 拼接 Url 及携带参数
     * @param url    URL 链接
     * @param params 请求参数字符串
     * @return {@code true} yes, {@code false} no
     */
    public static String joinUrlParams(
            final String url,
            final String params
    ) {
        if (StringUtils.isEmpty(params)) return url;
        // 获取拼接符号
        String symbol = getUrlParamsJoinSymbol(url, params);
        return url + symbol + params;
    }

    /**
     * 获取 Url 及携带参数 拼接符号
     * @param url    URL 链接
     * @param params 请求参数字符串
     * @return {@code true} yes, {@code false} no
     */
    public static String getUrlParamsJoinSymbol(
            final String url,
            final String params
    ) {
        if (StringUtils.isEmpty(params)) return "";
        // 判断是否存在参数
        if (existsParamsByURL(url)) {
            return "&";
        } else {
            return "?";
        }
    }

    // =

    /**
     * 通过 Url 拆分参数
     * @param url URL 链接
     * @return 拆分后的参数 Map
     */
    public static Map splitParamsByUrl(final String url) {
        return splitParamsByUrl(url, false);
    }

    /**
     * 通过 Url 拆分参数
     * @param url       URL 链接
     * @param urlEncode 是否需要 URL 编码
     * @return 拆分后的参数 Map
     */
    public static Map splitParamsByUrl(
            final String url,
            final boolean urlEncode
    ) {
        return splitParams(getUrlParams(url), urlEncode);
    }

    /**
     * 拆分参数
     * @param params 请求参数字符串
     * @return 拆分后的参数 Map
     */
    public static Map splitParams(final String params) {
        return splitParams(params, false);
    }

    /**
     * 拆分参数
     * @param params    请求参数字符串
     * @param urlEncode 是否需要 URL 编码
     * @return 拆分后的参数 Map
     */
    public static Map splitParams(
            final String params,
            final boolean urlEncode
    ) {
        Map mapParams = new LinkedHashMap<>();
        if (StringUtils.isNotEmpty(params)) {
            // 拆分数据
            String[] keyValues = params.split("&");
            // 数据长度
            int valLength;
            // 进行循环遍历
            for (String val : keyValues) {
                // 数据不为 null
                if (val != null && (valLength = val.length()) != 0) {
                    // 获取首位 = 索引
                    int indexOf = val.indexOf('=');
                    // 不存在则不处理
                    if (indexOf != -1) {
                        // 获取 key
                        String key = val.substring(0, indexOf);
                        // 获取 value
                        String value;
                        // 防止资源浪费
                        if (indexOf + 1 == valLength) {
                            value = "";
                        } else {
                            value = val.substring(indexOf + 1, valLength);
                        }
                        // 判断是否编码
                        if (urlEncode) {
                            mapParams.put(key, urlEncode(value));
                        } else {
                            mapParams.put(key, value);
                        }
                    }
                }
            }
        }
        return mapParams;
    }

    // =

    /**
     * 拼接请求参数
     * @param mapParams Map 请求参数
     * @return 拼接后的参数
     */
    public static String joinParams(final Map mapParams) {
        return joinParams(mapParams, false);
    }

    /**
     * 拼接请求参数
     * @param mapParams Map 请求参数
     * @param urlEncode 是否需要 URL 编码
     * @return 拼接后的参数
     */
    public static String joinParams(
            final Map mapParams,
            final boolean urlEncode
    ) {
        if (mapParams != null) {
            int           index   = 0;
            StringBuilder builder = new StringBuilder();
            for (Map.Entry entry : mapParams.entrySet()) {
                if (index > 0) builder.append('&');
                builder.append(entry.getKey());
                builder.append('=');
                builder.append(urlEncode ? urlEncode(entry.getValue()) : entry.getValue());
                index++;
            }
            return builder.toString();
        }
        return null;
    }

    // =

    /**
     * 拼接请求参数
     * @param mapParams Map 请求参数
     * @return 拼接后的参数
     */
    public static String joinParamsObj(final Map mapParams) {
        return joinParamsObj(mapParams, false);
    }

    /**
     * 拼接请求参数
     * @param mapParams Map 请求参数
     * @param urlEncode 是否需要 URL 编码
     * @return 拼接后的参数
     */
    public static String joinParamsObj(
            final Map mapParams,
            final boolean urlEncode
    ) {
        if (mapParams != null) {
            int           index   = 0;
            StringBuilder builder = new StringBuilder();
            for (Map.Entry entry : mapParams.entrySet()) {
                if (index > 0) builder.append('&');
                builder.append(entry.getKey());
                builder.append('=');
                if (urlEncode) {
                    String strValue = ConvertUtils.newStringNotArrayDecode(
                            entry.getValue()
                    );
                    if (strValue != null) {
                        builder.append(urlEncode(strValue));
                    }
                } else {
                    builder.append(entry.getValue());
                }
                index++;
            }
            return builder.toString();
        }
        return null;
    }

    // ======================================
    // = 拼接成, 模拟 JavaScript 传递对象数组格式 =
    // ======================================

    /**
     * 进行转换对象处理 ( 请求发送对象 )
     * @param mapParams Map 请求参数
     * @param objStr    数组名
     * @param key       数组 key
     * @param value     数组 [key] 保存值
     * @return {@code true} success, {@code false} fail
     */
    public static boolean convertObjToMS(
            final Map mapParams,
            final String objStr,
            final String key,
            final String value
    ) {
        if (mapParams != null) {
            String data = null;
            try {
                data = URLEncoder.encode(value, DevFinal.ENCODE.UTF_8);
            } catch (Exception e) {
                JCLogUtils.eTag(TAG, e, "convertObjToMS");
            }
            mapParams.put(objStr + "[" + key + "]", data);
            return true;
        }
        return false;
    }

    /**
     * 进行转换对象处理 ( 请求发送对象 )
     * @param mapParams Map 请求参数
     * @param objStr    数组名
     * @param key       数组 key
     * @param value     数组 [key] 保存值
     * @return {@code true} success, {@code false} fail
     */
    public static boolean convertObjToMO(
            final Map mapParams,
            final String objStr,
            final String key,
            final Object value
    ) {
        if (mapParams != null) {
            Object data = null;
            try {
                data = URLEncoder.encode(value.toString(), DevFinal.ENCODE.UTF_8);
            } catch (Exception e) {
                JCLogUtils.eTag(TAG, e, "convertObjToMO");
            }
            mapParams.put(objStr + "[" + key + "]", data);
            return true;
        }
        return false;
    }

    // ===============
    // = StringUtils =
    // ===============

    /**
     * 进行 URL 编码, 默认 UTF-8
     * @param str 待处理字符串
     * @return UTF-8 编码格式 URL 编码后的字符串
     */
    public static String urlEncode(final String str) {
        return StringUtils.urlEncode(str);
    }

    /**
     * 进行 URL 编码
     * @param str 待处理字符串
     * @param enc 编码格式
     * @return 指定编码格式 URL 编码后的字符串
     */
    public static String urlEncode(
            final String str,
            final String enc
    ) {
        return StringUtils.urlEncode(str, enc);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy