Java 示例代码
[font=PingFangSC, "]本示例不需要依赖第三方的库包,可以直接使用。签名步骤如下所示。
public static Map<String, String> splitQueryString(String url)
throws URISyntaxException, UnsupportedEncodingException {
URI uri = new URI(url);
String query = uri.getQuery();
final String[] pairs = query.split("&");
TreeMap<String, String> queryMap = new TreeMap<String, String>();
for (String pair : pairs) {
final int idx = pair.indexOf("=");
final String key = idx > 0 ? pair.substring(0, idx) : pair;
if (!queryMap.containsKey(key)) {
queryMap.put(key, URLDecoder.decode(pair.substring(idx + 1),
CHARSET_UTF8));
}
}
return queryMap;
}
/** 对参数名称和参数值进行URL编码**/
public static String generate(String method, Map<String, String> parameter,
String accessKeySecret) throws Exception {
String signString = generateSignString(method, parameter);
System.out.println("signString---" + signString);
byte[] signBytes = hmacSHA1Signature(accessKeySecret + "&", signString);
String signature = newStringByBase64(signBytes);
System.out.println("signature---" + signature);
if ("POST".equals(method))
return signature;
return URLEncoder.encode(signature, "UTF-8");
}
public static String generateSignString(String httpMethod,
Map<String, String> parameter) throws IOException {
TreeMap<String, String> sortParameter = new TreeMap<String, String>();
sortParameter.putAll(parameter);
String canonicalizedQueryString = UrlUtil.generateQueryString(
sortParameter, true);
if (null == httpMethod) {
throw new RuntimeException("httpMethod can not be empty");
}
/** 构造待签名的字符串* */
StringBuilder stringToSign = new StringBuilder();
stringToSign.append(httpMethod).append(SEPARATOR);
stringToSign.append(percentEncode("/")).append(SEPARATOR);
stringToSign.append(percentEncode(canonicalizedQueryString));
return stringToSign.toString();
}
public static byte[] hmacSHA1Signature(String secret, String baseString)
throws Exception {
if (isEmpty(secret)) {
throw new IOException("secret can not be empty");
}
if (isEmpty(baseString)) {
return null;
}
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec keySpec = new SecretKeySpec(
secret.getBytes(CHARSET_UTF8), ALGORITHM);
mac.init(keySpec);
return mac.doFinal(baseString.getBytes(CHARSET_UTF8));
}
private static boolean isEmpty(String str) {
return (str == null || str.length() == 0);
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您的Java示例代码似乎是要解析URL中的查询字符串,并将其分割成键值对。下面是一个基于您给出的代码片段的完整Java方法示例,这个方法会将查询字符串分割成一个Map,其中键是参数名,值是参数值。请注意,这里直接使用了Java标准库,并没有依赖任何第三方库,正如您所要求的。
import java.net.URI;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;
public class QueryStringParser {
public static void main(String[] args) throws URISyntaxException, UnsupportedEncodingException {
String url = "http://example.com/?key1=value1&key2=value2";
Map<String, String> queryPairs = splitQueryString(url);
for (Map.Entry<String, String> entry : queryPairs.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
/**
* 分割URL中的查询字符串为键值对的Map。
*
* @param url 包含查询字符串的URL
* @return 查询参数的Map
* @throws URISyntaxException 如果URL格式不正确
* @throws UnsupportedEncodingException 如果编码不支持
*/
public static Map<String, String> splitQueryString(String url) throws URISyntaxException, UnsupportedEncodingException {
URI uri = new URI(url);
String query = uri.getQuery();
if (query == null || query.isEmpty()) {
return new HashMap<>();
}
String[] pairs = query.split("&");
Map<String, String> params = new HashMap<>();
for (String pair : pairs) {
int idx = pair.indexOf('=');
String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair;
String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : null;
params.put(key, value);
}
return params;
}
}
这段代码首先定义了一个QueryStringParser
类,其中包含一个splitQueryString
静态方法,该方法接收一个包含查询字符串的URL作为输入,然后解析这个查询字符串,将其转换为一个Map对象。此外,还提供了一个main
方法来演示如何使用这个函数,通过构造一个包含查询参数的URL并打印出解析后的结果。