欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

SpringBoot进阶教程(八十六)URL指定参数encode,v直接demoimp

来源: javaer 分享于  点击 12709 次 点评:238

SpringBoot进阶教程(八十六)URL指定参数encode,v直接demoimp


Encode(编码)和Decode(解码)是在信息处理中常用的概念,用于表示将信息从一种形式转换为另一种形式的过程。

v直接demo

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
     * @param targetParam
     * @param ignore
     * @return
     */
    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;
        }
    }
}

v源码地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn


作  者:请叫我头头哥
出  处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!

相关栏目:

用户点评