Modifier and Type | Method and Description |
---|---|
static String |
addParameter(String uriString,
String paramName,
String paramValue,
String charsetType)
给指定的
uriString 添加指定的参数 paramName 和值 paramValue . |
static String |
addParameterArrayValueMap(String uriString,
Map<String,String[]> arrayValueMap,
String charsetType)
给指定的
uriString 添加参数 arrayValueMap ,如果uri包含指定的参数名字,那么会被新的值替换. |
static String |
addParameterSingleValueMap(String uriString,
Map<String,String> singleValueMap,
String charsetType)
给指定的
uriString 添加指定的参数 singleValueMap . |
static <K> String |
joinValuesOrderByIncludeKeys(Map<K,String> singleValueMap,
K... includeKeys)
在
singleValueMap 中取到指定includeKeys key的value,连接起来(不使用任何连接符). |
static String |
toNaturalOrderingJoinValue(Map<String,String> singleValueMap)
将
singleValueMap 转成自然排序 , 然后仅将value直接拼接成字符串(不使用 = 和& 分隔). |
static String |
toNaturalOrderingKeyJoinValue(Map<String,String> singleValueMap)
将
singleValueMap 转成自然排序 , 然后将key和value直接拼接成字符串(不使用 = 和& 分隔). |
static String |
toNaturalOrderingQueryString(Map<String,String> singleValueMap)
将
singleValueMap 转成自然排序 的 queryString 字符串. |
static String |
toQueryStringUseArrayValueMap(Map<String,String[]> arrayValueMap)
只是简单的将map的key value 连接起来,最终格式类似于 url 的queryString.
|
static String |
toQueryStringUseSingleValueMap(Map<String,String> singleValueMap)
将
singleValueMap 转成 queryString. |
static Map<String,String> |
toSingleValueMap(String queryString,
String charsetType)
将
a=1&b=2 这样格式的 queryString 数据转换成map. |
public static String addParameter(String uriString, String paramName, String paramValue, String charsetType)
uriString
添加指定的参数 paramName
和值 paramValue
.
- 如果原来的
uriString
没有指定的参数paramName
,那么追加新的参数paramName
和值paramValue
.- 如果原来的
uriString
有指定的参数paramName
,那么会被新的值替换paramValue
.- 如果原来的
uriString
有指定的参数paramName
,并且是多值类型(参数数组),那么多值参数中第一个会被新的值替换paramValue
,其他的被丢弃.- 如果原来的
uriString
有参数,不管是拼接还是替换都会保持参数的原始顺序.- 如果
uriString
带有? 和参数,会先被截取,最后再拼接.- 如果
uriString
不带?,则自动增加?
String uri = "http://www.feilong.com:8888/esprit-frontend/search.htm?返回:keyword=%E6%81%A4&page=
"; String pageParamName = "label"; String prePageNo = "2-5-8-12"; LOGGER.info(ParamUtil.addParameter(uri, pageParamName, prePageNo, UTF8));http://www.feilong.com:8888/esprit-frontend/search.htm?keyword=%E6%81%A4&page=&label=2-5-8-12
uriString
- 如果带有? 和参数,会先被截取,最后再拼接,paramName
- 添加的参数名称paramValue
- 添加的参数值charsetType
- 字符编码,建议使用 CharsetType
定义好的常量uriString
是null或者empty,返回 StringUtils.EMPTY
paramName
是null,以 StringUtils.EMPTY
替代paramValue
是null,以 StringUtils.EMPTY
替代addParameterSingleValueMap(String, Map, String)
public static String addParameterSingleValueMap(String uriString, Map<String,String> singleValueMap, String charsetType)
uriString
添加指定的参数 singleValueMap
.
- 如果原来的
uriString
没有指定的参数paramName
,那么循环arrayValueMap
,追加新的参数paramName
和值paramValue
.- 如果原来的
uriString
有指定的参数paramName
,那么会被新的值替换paramValue
.- 如果原来的
uriString
有指定的参数paramName
,并且是多值类型(参数数组),那么多值参数中第一个会被新的值替换paramValue
,其他的被丢弃.- 如果原来的
uriString
有参数,不管是拼接还是替换都会保持参数的原始顺序.- 如果
uriString
带有? 和参数,会先被截取,最后再拼接.- 如果
uriString
不带?,则自动增加?
String beforeUrl = "www.baidu.com"; Map返回:<String, String>
keyAndArrayMap = new LinkedHashMap<>
(); keyAndArrayMap.put("province", "江苏省"); keyAndArrayMap.put("city", "南通市"); LOGGER.info(ParamUtil.addParameterSingleValueMap(beforeUrl, keyAndArrayMap, UTF8));www.baidu.com?province=%E6%B1%9F%E8%8B%8F%E7%9C%81&city=%E5%8D%97%E9%80%9A%E5%B8%82
String beforeUrl = "www.baidu.com?a=b"; Map返回:<String, String>
keyAndArrayMap = new LinkedHashMap<>
(); keyAndArrayMap.put("province", "江苏省"); keyAndArrayMap.put("city", "南通市"); LOGGER.info(ParamUtil.addParameterSingleValueMap(beforeUrl, keyAndArrayMap, UTF8));www.baidu.com?a=b&province=%E6%B1%9F%E8%8B%8F%E7%9C%81&city=%E5%8D%97%E9%80%9A%E5%B8%82
uriString
- 如果带有? 和参数,会先被截取,最后再拼接,singleValueMap
- singleValueMap param name 和value 的键值对charsetType
- 字符编码,建议使用 CharsetType
定义好的常量uriString
是null或者empty,返回 StringUtils.EMPTY
singleValueMap
是null,当作empty map处理addParameterArrayValueMap(String, Map, String)
public static String addParameterArrayValueMap(String uriString, Map<String,String[]> arrayValueMap, String charsetType)
uriString
添加参数 arrayValueMap
,如果uri包含指定的参数名字,那么会被新的值替换.
- 如果原来的
uriString
没有指定的参数paramName
,那么循环arrayValueMap
,追加新的参数paramName
和值paramValue
.- 如果原来的
uriString
有指定的参数paramName
,那么会被新的值替换paramValue
.- 如果原来的
uriString
有指定的参数paramName
,并且是多值类型(参数数组),那么多值参数中第一个会被新的值替换paramValue
,其他的被丢弃.- 如果原来的
uriString
有参数,不管是拼接还是替换都会保持参数的原始顺序.- 如果
uriString
带有? 和参数,会先被截取,最后再拼接.- 如果
uriString
不带?,则自动增加?
String beforeUrl = "www.baidu.com"; Map返回:<String, String[]>
keyAndArrayMap = new LinkedHashMap<>
(); keyAndArrayMap.put("receiver", new String[] { "鑫哥", "feilong" }); keyAndArrayMap.put("province", new String[] { "江苏省" }); keyAndArrayMap.put("city", new String[] { "南通市" }); LOGGER.info(ParamUtil.addParameterArrayValueMap(beforeUrl, keyAndArrayMap, UTF8));www.baidu.com?receiver=%E9%91%AB%E5%93%A5&receiver=feilong&province=%E6%B1%9F%E8%8B%8F%E7%9C%81&city=%E5%8D%97%E9%80%9A%E5%B8%82
String beforeUrl = "www.baidu.com?a=b"; Map返回:<String, String[]>
keyAndArrayMap = new LinkedHashMap<>
(); keyAndArrayMap.put("province", new String[] { "江苏省" }); keyAndArrayMap.put("city", new String[] { "南通市" }); LOGGER.info(ParamUtil.addParameterArrayValueMap(beforeUrl, keyAndArrayMap, UTF8));www.baidu.com?a=b&province=%E6%B1%9F%E8%8B%8F%E7%9C%81&city=%E5%8D%97%E9%80%9A%E5%B8%82
uriString
- 如果带有? 和参数,会先被截取,最后再拼接,arrayValueMap
- the name and array value mapcharsetType
- 字符编码,建议使用 CharsetType
定义好的常量uriString
是null或者empty,返回 StringUtils.EMPTY
arrayValueMap
是null,当作empty map处理charsetType
是null或者empty,那么参数部分原样拼接处理,自行处理兼容性问题addParameterArrayValueMap(String, String, Map, String)
public static Map<String,String> toSingleValueMap(String queryString, String charsetType)
a=1&b=2
这样格式的 queryString
数据转换成map.
- 如果参数里面有相同名字的参数,那么转换的时候取第一个值
- 内部使用
LinkedHashMap
,map顺序依照queryString
分隔的顺序
String queryString = "返回:sec_id=MD5&format=xml&sign=cc945983476d615ca66cee41a883f6c1&v=2.0&req_data=%3Cauth_and_execute_req%3E%3Crequest_token%3E201511191eb5762bd0150ab33ed73976f7639893%3C%2Frequest_token%3E%3C%2Fauth_and_execute_req%3E&service=alipay.wap.auth.authAndExecute&partner=2088011438559510
"; LOGGER.info(JsonUtil.format(ParamUtil.toSingleValueMap(queryString, UTF8)));{ "sec_id": "MD5", "format": "xml", "sign": "cc945983476d615ca66cee41a883f6c1", "v": "2.0", "req_data":"%3Cauth_and_execute_req%3E%3Crequest_token%3E201511191eb5762bd0150ab33ed73976f7639893%3C%2Frequest_token%3E%3C%2Fauth_and_execute_req%3E", "service": "alipay.wap.auth.authAndExecute", "partner": "2088011438559510" }
queryString
- the query stringcharsetType
- 字符编码,建议使用 CharsetType
定义好的常量queryString
是null或者empty,返回 Collections.emptyMap()
toSafeArrayValueMap(String, String)
public static String toNaturalOrderingKeyJoinValue(Map<String,String> singleValueMap)
singleValueMap
转成自然排序
, 然后将key和value直接拼接成字符串(不使用 =
和&
分隔).
已知,适用于 网易易盾验证码
Map返回:<String, String>
map = newHashMap(); map.put("service", "create_salesorder"); map.put("_input_charset", "gbk"); map.put("totalActual", "210.00"); map.put("address", "江苏南通市通州区888组888号"); LOGGER.debug(ParamUtil.toNaturalOrderingKeyJoinValue(map));_input_charsetgbkaddress江苏南通市通州区888组888号servicecreate_salesordertotalActual210.00
- 首先将
singleValueMap
使用SortUtil.sortMapByKeyAsc(Map)
进行排序,- 然后将map的key和value 直接连接
- 常用于和第三方对接数据(比如网易易盾验证码,生成 待签名的字符串)
- 该方法不会执行encode操作,使用原生值进行拼接
对于 null key或者null value的处理:
如果
singleValueMap
中,
如果有key
是null
,那么会使用StringUtils.EMPTY
进行拼接;
如果有value
是null
,那么会使用StringUtils.EMPTY
进行拼接示例:
Map返回:<String, String>
map = newHashMap(); map.put("totalActual", null); map.put(null, "create_salesorder"); map.put("province", "江苏省"); LOGGER.debug(ParamUtil.toNaturalOrderingKeyJoinValue(map));create_salesorderprovince江苏省totalActual
singleValueMap
- 用于拼接签名的参数singleValueMap
是null或者empty,返回 StringUtils.EMPTY
singleValueMap
排序之后,循环直接拼接key和valuepublic static String toNaturalOrderingJoinValue(Map<String,String> singleValueMap)
singleValueMap
转成自然排序
, 然后仅将value直接拼接成字符串(不使用 =
和&
分隔).
已知,适用于 银联大华捷通
Map返回:<String, String>
map = newHashMap(); map.put("service", "create_salesorder"); map.put("_input_charset", "gbk"); map.put("totalActual", "210.00"); map.put("address", "江苏南通市通州区888组888号"); LOGGER.debug(ParamUtil.toNaturalOrderingJoinValue(map));gbk江苏南通市通州区888组888号create_salesorder210.00
- 首先将
singleValueMap
使用SortUtil.sortMapByKeyAsc(Map)
进行排序,- 然后将map的value 直接连接
- 常用于和第三方对接数据(比如银联大华捷通,生成 待签名的字符串)
- 该方法不会执行encode操作,使用原生值进行拼接
对于 null key或者null value的处理:
如果
singleValueMap
中,
如果有value
是null
,那么会使用StringUtils.EMPTY
进行拼接示例:
Map返回:<String, String>
map = newHashMap(); map.put("totalActual", null); map.put("province", "江苏省"); LOGGER.debug(ParamUtil.toNaturalOrderingKeyJoinValue(map));江苏省
singleValueMap
- 用于拼接签名的参数singleValueMap
是null或者empty,返回 StringUtils.EMPTY
singleValueMap
排序之后,循环直接拼接valuepublic static String toNaturalOrderingQueryString(Map<String,String> singleValueMap)
singleValueMap
转成自然排序
的 queryString
字符串.
Map返回:<String, String>
map = newHashMap(); map.put("service", "create_salesorder"); map.put("_input_charset", "gbk"); map.put("totalActual", "210.00"); map.put("address", "江苏南通市通州区888组888号"); LOGGER.debug(ParamUtil.toNaturalOrderingQueryString(map));_input_charset=gbk&address=江苏南通市通州区888组888号&service=create_salesorder&totalActual=210.00
- 首先将
singleValueMap
使用SortUtil.sortMapByKeyAsc(Map)
进行排序,- 然后将map的key和value 使用= 符号 连接,不同的entry之间再使用
&
符号进行连接,最终格式类似于 url 的queryString
- 常用于和第三方对接数据(比如支付宝,生成 待签名的字符串)
- 该方法不会执行encode操作,使用原生值进行拼接
对于 null key或者null value的处理:
如果
singleValueMap
中,
如果有key
是null
,那么会使用StringUtils.EMPTY
进行拼接;
如果有value
是null
,那么会使用StringUtils.EMPTY
进行拼接示例:
Map返回:<String, String>
map = newHashMap(); map.put("totalActual", null); map.put(null, "create_salesorder"); map.put("province", "江苏省"); LOGGER.debug(ParamUtil.toNaturalOrderingQueryString(map));=create_salesorder&province=江苏省&totalActual=
singleValueMap
- 用于拼接签名的参数singleValueMap
是null或者empty,返回 StringUtils.EMPTY
singleValueMap
排序之后,调用 toQueryStringUseSingleValueMap(Map)
public static String toQueryStringUseSingleValueMap(Map<String,String> singleValueMap)
singleValueMap
转成 queryString.
- 只是简单的将map的key value 按照
singleValueMap
的顺序 连接起来,最终格式类似于 url 的queryString,
比如,参数名字param Name=name
,param Value=zhangfei
,那么返回值是name=zhangfei
- 如果
singleValueMap
有key 是null,将使用StringUtils.EMPTY
进行拼接- 如果
singleValueMap
有value 是null,将使用StringUtils.EMPTY
进行拼接
Map返回:<String, String>
singleValueMap = new LinkedHashMap<>
(); singleValueMap.put("province", "江苏省"); singleValueMap.put("city", "南通市"); LOGGER.info(ParamUtil.joinSingleValueMap(singleValueMap));province=江苏省&city=南通市
Map返回:<String, String>
map = new LinkedHashMap<>
(); map.put(null, null); map.put("a", ""); map.put("b", null); map.put("c", "jim"); LOGGER.info(ParamUtil.toQueryStringUseSingleValueMap(map));=&a=&b=&c=jim
singleValueMap
- the params mapsingleValueMap
是 null或者empty,返回 StringUtils.EMPTY
singleValueMap
转成 MapUtil.toArrayValueMap(Map)
,再调用 toQueryStringUseArrayValueMap(Map)
MapUtil.toArrayValueMap(Map)
,
toQueryStringUseArrayValueMap(Map)
,
build-convert-map-to-query-stringpublic static String toQueryStringUseArrayValueMap(Map<String,String[]> arrayValueMap)
- 该方法不会执行encode操作,使用原生值进行拼接
- 按照传入的map key顺序进行排序,不会自行自动排序转换;如有有业务需求,先行排序完传入进来
- 如果
arrayValueMap
有key 是null,将使用StringUtils.EMPTY
进行拼接- 如果
arrayValueMap
有value的元素是null,将使用StringUtils.EMPTY
进行拼接
Map返回:<String, String[]>
keyAndArrayMap = new LinkedHashMap<>
(); keyAndArrayMap.put("province", new String[] { "江苏省", "浙江省" }); keyAndArrayMap.put("city", new String[] { "南通市" }); LOGGER.info(ParamUtil.joinArrayValueMap(keyAndArrayMap));province=江苏省&province=浙江省&city=南通市
Map返回:<String, String[]>
keyAndArrayMap = new LinkedHashMap<>
(); keyAndArrayMap.put("province", new String[] { "江苏省", null }); keyAndArrayMap.put("city", new String[] { "南通市" }); LOGGER.info(ParamUtil.joinArrayValueMap(keyAndArrayMap));province=江苏省&province=&city=南通市
arrayValueMap
- the array value maparrayValueMap
是 null或者Empty,返回 StringUtils.EMPTY
arrayValueMap
拼接成QueryString@SafeVarargs public static <K> String joinValuesOrderByIncludeKeys(Map<K,String> singleValueMap, K... includeKeys)
singleValueMap
中取到指定includeKeys
key的value,连接起来(不使用任何连接符).
- 拼接的顺序按照
includeKeys
的顺序,目前适用于个别银行(比如汇付天下)需要将值拼接起来加密- 如果
singleValueMap
中的value是null,那么会以StringUtils.EMPTY
替代,进行拼接
场景: 拼接map中 key是 "service"以及 "paymentType"的 value
Map<String, String>
map = newHashMap(); map.put("service", "create_salesorder"); map.put("paymentType", "unionpay_mobile"); ParamUtil.joinValuesOrderByIncludeKeys(map, "service", "paymentType") = create_salesorderunionpay_mobile
K
- the key typesingleValueMap
- the mapincludeKeys
- 包含的keysingleValueMap
是null,抛出 NullPointerException
includeKeys
是null或者empty,返回 StringUtils.EMPTY
includeKeys
,依次从 singleValueMap
中取到值,连接起来;StringUtils.defaultString(String)
Copyright © 2008-2019 by feilong