java解析querystring_Java 将URI字符串解析为Name-Value集合

小编典典

如果你正在寻找一种无需使用外部库即可实现的方法,则以下代码将为你提供帮助。

public static Map splitQuery(URL url) throws UnsupportedEncodingException {

Map query_pairs = new LinkedHashMap();

String query = url.getQuery();

String[] pairs = query.split("&");

for (String pair : pairs) {

int idx = pair.indexOf("=");

query_pairs.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"), URLDecoder.decode(pair.substring(idx + 1), "UTF-8"));

}

return query_pairs;

}

你可以使用来访问返回的Map .get("client_id"),并在问题中提供URL,这将返回“ SS”。

添加了更新 URL解码

更新由于此答案仍然很受欢迎,因此我对上述方法进行了改进,该方法可以处理具有相同键的多个参数以及没有值的参数。

public static Map> splitQuery(URL url) throws UnsupportedEncodingException {

final Map> query_pairs = new LinkedHashMap>();

final String[] pairs = url.getQuery().split("&");

for (String pair : pairs) {

final int idx = pair.indexOf("=");

final String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair;

if (!query_pairs.containsKey(key)) {

query_pairs.put(key, new LinkedList());

}

final String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : null;

query_pairs.get(key).add(value);

}

return query_pairs;

}

UPDATE Java8版本

public Map> splitQuery(URL url) {

if (Strings.isNullOrEmpty(url.getQuery())) {

return Collections.emptyMap();

}

return Arrays.stream(url.getQuery().split("&"))

.map(this::splitQueryParameter)

.collect(Collectors.groupingBy(SimpleImmutableEntry::getKey, LinkedHashMap::new, mapping(Map.Entry::getValue, toList())));

}

public SimpleImmutableEntry splitQueryParameter(String it) {

final int idx = it.indexOf("=");

final String key = idx > 0 ? it.substring(0, idx) : it;

final String value = idx > 0 && it.length() > idx + 1 ? it.substring(idx + 1) : null;

return new SimpleImmutableEntry<>(key, value);

}

使用网址运行上述方法

https://stackoverflow.com?param1=value1&param2=&param3=value3&param3

返回此地图:

{param1=["value1"], param2=[null], param3=["value3", null]}

2020-02-27

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Web中,可以通过POST方法将加密字符串发送到web接口,同时可以获取QueryString参数和Header参数。 以下是一个简单的示例代码,演示如何在Spring Boot中接收加密字符串,同时获取QueryString参数和Header参数: ```java import org.springframework.web.bind.annotation.*; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; @RestController public class MyController { @RequestMapping(value = "/my-api", method = RequestMethod.POST) public String myApi(@RequestBody String encryptedData, @RequestHeader("MyHeader") String myHeader, @RequestParam("MyParam") String myParam) throws Exception { //解密加密字符串 String decryptedData = decryptData(encryptedData, "my-secret-key"); //打印Header参数和QueryString参数 System.out.println("MyHeader: " + myHeader); System.out.println("MyParam: " + myParam); //将解密后的数据存储到数据库或进行其他操作 //TODO: do something with decrypted data //返回响应 return "OK"; } //使用AES算法解密数据 private String decryptData(String encryptedData, String secretKey) throws Exception { Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "AES"); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); byte[] decryptedBytes = cipher.doFinal(Base64.getMimeDecoder().decode(encryptedData.getBytes(StandardCharsets.UTF_8))); return new String(decryptedBytes, StandardCharsets.UTF_8); } } ``` 这个示例中使用的是AES算法解密加密字符串。你需要将“my-secret-key”替换为你的真实密钥,并根据实际情况修改解密算法和密钥长度。同时,你需要将“MyHeader”和“MyParam”替换为你的真实Header参数和QueryString参数的名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值