Spring Boot高级指南:URL特定参数的编码设定
编码与解码的基础概念
编码(Encode)和解码(Decode)是信息处理中常用的操作,其作用是将信息从一种形式转换为另一种形式。
直接演示代码
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
public class UrlParamEncoder {
public static void main(String[] args) throws UnsupportedEncodingException {
String url = "https://www.test.com/s?wd=%E7%99%BE%E5%BA%A6&rsv_spt=1&rsv_iqid=0xbe352d6c00064d34&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=tb&rsv_enter=1&rsv_sug3=17&rsv_sug1=8&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&prefixsug=%25E7%2599%25BE%25E5%25BA%25A6&rsp=6&inputT=3412&rsv_sug4=5053";
String encodedUrl = encodeSpecificParam(url, "prefixsug", true);
System.out.println(url);
System.out.println(encodedUrl);
}
/**
* 对指定参数进行编码
* ignore表示是否先解码再编码
* @param url 目标URL
* @param targetParam 要处理的参数名
* @param ignore 是否先解码再编码的标识
* @return 处理后的URL
*/
public static String encodeSpecificParam(String url, String targetParam, boolean ignore) {
try {
// 分割基础URL和查询部分
String[] urlParts = url.split("\\?", 2);
String baseUrl = urlParts[0];
String queryAndFragment = urlParts.length > 1 ? urlParts[1] : "";
// 分离查询参数和锚点
String[] queryFragment = queryAndFragment.split("#", 2);
String query = queryFragment[0];
String fragment = queryFragment.length > 1 ? "#" + queryFragment[1] : "";
// 解析查询参数
List<Param> params = parseQueryString(query);
// 编码目标参数
for (Param param : params) {
if (param.key.equals(targetParam)) {
String decoded = ignore ? param.value : URLDecoder.decode(param.value, "UTF-8");
String encoded = URLEncoder.encode(decoded, "UTF-8")
.replace("+", "%20"); // 将+转换为%20
param.value = encoded;
}
}
// 重构查询字符串
StringBuilder newQuery = new StringBuilder();
for (Param param : params) {
if (newQuery.length() > 0) {
newQuery.append("&");
}
newQuery.append(param.key).append("=").append(param.value);
}
// 组合最终URL
return baseUrl
+ (newQuery.length() > 0 ? "?" : "")
+ newQuery.toString()
+ fragment;
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("字符编码出现错误", e);
}
}
private static List<Param> parseQueryString(String query) {
List<Param> params = new ArrayList<>();
if (query == null || query.isEmpty()) return params;
for (String pair : query.split("&")) {
int idx = pair.indexOf("=");
String key = (idx > 0) ? pair.substring(0, idx) : pair;
String value = (idx > 0 && pair.length() > idx + 1) ? pair.substring(idx + 1) : "";
params.add(new Param(key, value));
}
return params;
}
static class Param {
String key;
String value;
Param(String key, String value) {
this.key = key;
this.value = value;
}
}
}
源码获取地址
https://github.com/toutouge/javademosecond/tree/master/hellolearn
作者信息
作者:唤我头头君
出处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。若有疑问或建议,欢迎多多交流!
版权声明:本文版权归作者与博客园共同所有,欢迎转载,但未获作者许可时需保留此声明,并在文章显著位置展示原文链接。
特别说明:所有评论与私信都会及时回复。也欢迎园中的前辈们指出错误,携手共进。或者直接发私信给我
支持博主:若觉得文章对您有帮助,可点击文章右下角的【推荐】按钮,您的鼓励是作者坚持原创与持续创作的最大动力!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...