Java URL编解码案例

wen java案例 1

本文目录导读:

Java URL编解码案例

  1. 基本URL编码和解码
  2. 完整工具类实现
  3. 实用案例
  4. Spring Boot中的URL编解码
  5. 完整的测试代码
  6. 重要注意事项

我来为您提供Java中URL编解码的完整案例。

基本URL编码和解码

import java.net.URLEncoder;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.io.UnsupportedEncodingException;
public class BasicUrlCodec {
    public static void main(String[] args) throws UnsupportedEncodingException {
        // 原始字符串
        String original = "你好,世界! Hello World! 中文测试 & 特殊字符=100%";
        // URL编码
        String encoded = URLEncoder.encode(original, StandardCharsets.UTF_8.name());
        System.out.println("编码后: " + encoded);
        // URL解码
        String decoded = URLDecoder.decode(encoded, StandardCharsets.UTF_8.name());
        System.out.println("解码后: " + decoded);
        // 验证是否一致
        System.out.println("验证结果: " + original.equals(decoded));
    }
}

完整工具类实现

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.Map;
public class UrlUtil {
    private static final String DEFAULT_CHARSET = StandardCharsets.UTF_8.name();
    /**
     * URL编码
     */
    public static String encode(String value) {
        return encode(value, DEFAULT_CHARSET);
    }
    /**
     * URL编码(指定字符集)
     */
    public static String encode(String value, String charset) {
        if (value == null) return null;
        try {
            return URLEncoder.encode(value, charset);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("URL编码失败", e);
        }
    }
    /**
     * URL解码
     */
    public static String decode(String value) {
        return decode(value, DEFAULT_CHARSET);
    }
    /**
     * URL解码(指定字符集)
     */
    public static String decode(String value, String charset) {
        if (value == null) return null;
        try {
            return URLDecoder.decode(value, charset);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("URL解码失败", e);
        }
    }
    /**
     * 生成带查询参数的URL
     */
    public static String buildUrl(String baseUrl, Map<String, String> params) {
        if (params == null || params.isEmpty()) {
            return baseUrl;
        }
        StringBuilder sb = new StringBuilder(baseUrl);
        sb.append(baseUrl.contains("?") ? "&" : "?");
        boolean first = true;
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (!first) {
                sb.append("&");
            }
            sb.append(encode(entry.getKey()))
              .append("=")
              .append(encode(entry.getValue()));
            first = false;
        }
        return sb.toString();
    }
    /**
     * 解析URL查询参数
     */
    public static Map<String, String> parseQueryParams(String url) {
        Map<String, String> params = new LinkedHashMap<>();
        if (url == null || url.isEmpty()) return params;
        String query = url.contains("?") ? url.substring(url.indexOf("?") + 1) : url;
        if (query.isEmpty()) return params;
        String[] pairs = query.split("&");
        for (String pair : pairs) {
            String[] keyValue = pair.split("=", 2);
            if (keyValue.length == 2) {
                params.put(decode(keyValue[0]), decode(keyValue[1]));
            }
        }
        return params;
    }
}

实用案例

import java.util.HashMap;
import java.util.Map;
public class UrlCodecExample {
    public static void main(String[] args) {
        // 案例1: 基础编解码
        basicExample();
        // 案例2: 构建带参数的URL
        buildUrlExample();
        // 案例3: 解析URL参数
        parseUrlExample();
        // 案例4: 不同场景编码
        differentScenarioExample();
    }
    /**
     * 基础编解码示例
     */
    private static void basicExample() {
        System.out.println("=== 基础编解码示例 ===");
        String[] testStrings = {
            "Hello World",
            "你好世界",
            "user@example.com/?name=张三&age=25",
            "测试#特殊&字符=100%"
        };
        for (String str : testStrings) {
            String encoded = UrlUtil.encode(str);
            String decoded = UrlUtil.decode(encoded);
            System.out.println("原始: " + str);
            System.out.println("编码: " + encoded);
            System.out.println("解码: " + decoded);
            System.out.println("是否一致: " + str.equals(decoded));
            System.out.println("-".repeat(50));
        }
    }
    /**
     * 构建URL示例
     */
    private static void buildUrlExample() {
        System.out.println("\n=== 构建带参数的URL ===");
        Map<String, String> params = new HashMap<>();
        params.put("keyword", "Java 编程");
        params.put("page", "1");
        params.put("size", "10");
        params.put("sort", "创建时间");
        String url = UrlUtil.buildUrl("https://example.com/api/search", params);
        System.out.println("生成的URL: " + url);
        // 解析回参数
        Map<String, String> parsedParams = UrlUtil.parseQueryParams(url);
        System.out.println("解析的参数: " + parsedParams);
    }
    /**
     * 解析URL示例
     */
    private static void parseUrlExample() {
        System.out.println("\n=== 解析URL参数 ===");
        String complexUrl = "https://example.com/path?city=北京&lat=39.90&lng=116.40&tags=科技%2C金融";
        Map<String, String> params = UrlUtil.parseQueryParams(complexUrl);
        System.out.println("完整URL: " + complexUrl);
        System.out.println("解析结果:");
        params.forEach((key, value) -> System.out.println("  " + key + " = " + value));
    }
    /**
     * 不同场景编码
     */
    private static void differentScenarioExample() {
        System.out.println("\n=== 不同场景编码 ===");
        // 1. 路径参数编码
        String path = "产品目录/手机/新款手机";
        String encodedPath = UrlUtil.encode(path);
        System.out.println("路径编码: " + encodedPath);
        // 2. 表单数据编码
        String formData = "username=张三&password=abc123&note=特殊字符:%&*";
        String encodedForm = UrlUtil.encode(formData);
        System.out.println("表单编码: " + encodedForm);
        // 3. 文件下载URL
        String fileName = "年度报告-2024.pdf";
        String downloadUrl = "https://example.com/download?file=" + UrlUtil.encode(fileName);
        System.out.println("下载URL: " + downloadUrl);
        // 4. 多语言内容
        String multilang = "こんにちは Καλημέρα Привет مرحبا";
        String encodedMulti = UrlUtil.encode(multilang);
        System.out.println("多语言编码: " + encodedMulti);
        System.out.println("多语言解码: " + UrlUtil.decode(encodedMulti));
    }
}

Spring Boot中的URL编解码

import org.springframework.web.util.UriComponentsBuilder;
import org.springframework.web.util.UriUtils;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class SpringUrlExample {
    /**
     * 使用UriComponentsBuilder构建URL
     */
    public static void buildUrlWithSpring() {
        Map<String, String> params = new HashMap<>();
        params.put("keyword", "火锅 北京");
        params.put("page", "1");
        params.put("pageSize", "20");
        URI uri = UriComponentsBuilder.fromUriString("https://api.example.com/search")
                .queryParam("keyword", params.get("keyword"))
                .queryParam("page", params.get("page"))
                .queryParam("pageSize", params.get("pageSize"))
                .build()
                .toUri();
        System.out.println("Spring构建URL: " + uri);
    }
    /**
     * 使用UriUtils进行编解码
     */
    public static void encodeDecodeWithSpring() {
        String original = "Hello 你好 World!";
        // 编码
        String encoded = UriUtils.encode(original, StandardCharsets.UTF_8);
        System.out.println("Spring编码: " + encoded);
        // 解码
        String decoded = UriUtils.decode(encoded, StandardCharsets.UTF_8);
        System.out.println("Spring解码: " + decoded);
    }
}

完整的测试代码

import java.util.Map;
public class Main {
    public static void main(String[] args) {
        System.out.println("========== URL编解码完整测试 ==========\n");
        // 运行所有示例
        UrlCodecExample.main(null);
        // Spring示例
        System.out.println("\n========== Spring工具测试 ==========");
        SpringUrlExample.buildUrlWithSpring();
        SpringUrlExample.encodeDecodeWithSpring();
        // 边界测试
        System.out.println("\n========== 边界测试 ==========");
        testEdgeCases();
    }
    private static void testEdgeCases() {
        // 空字符串
        System.out.println("空字符串: '" + UrlUtil.encode("") + "'");
        // null值
        System.out.println("null值: " + UrlUtil.encode(null));
        // 仅特殊字符
        String special = "!@#$%^&*()";
        System.out.println("特殊字符: " + special + " -> " + UrlUtil.encode(special));
        // 长文本
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 1000; i++) {
            sb.append("测试");
        }
        String longText = sb.toString();
        String encodedLong = UrlUtil.encode(longText);
        System.out.println("长文本长度: " + longText.length() + " -> 编码后长度: " + encodedLong.length());
    }
}

重要注意事项

  1. 字符集一致性: 编码和解码必须使用相同的字符集,推荐使用UTF-8
  2. 空格处理: URLEncoder把空格编码为,URLDecoder把解码为空格
  3. 特殊字符: 某些字符在URL中有特殊含义,需要特别处理
  4. 性能考虑: 大量数据编解码时注意性能问题
  5. 安全性: 不要对已编码的URL再次编码,会导致双重编码问题
  6. 路径 vs 查询参数: 路径中的某些字符(如、)在路径和查询参数中的处理可能不同

这些示例覆盖了Java中URL编解码的常见场景,可以根据实际需求选择合适的实现方式。

抱歉,评论功能暂时关闭!