从Java后台发送GET请求到另一个Java程序时参数接收中文乱码的解决办法

前言

在Java开发中,经常会遇到需要从一个后台程序向另一个后台程序发送HTTP请求的场景。而很多时候,我们需要通过GET请求来传递参数给目标程序。但是在传递中文参数时,很容易遇到乱码的问题。本文将介绍为什么会出现这个问题,以及如何解决这个问题。

为什么会出现乱码问题

在HTTP请求中,参数是通过URL的查询字符串传递的,而URL中只支持ASCII字符集,中文字符需要进行编码才能传递。常见的编码方式有两种:URL编码和Base64编码。

URL编码

URL编码是将URL中的非ASCII字符转换成%xx的形式,其中xx表示字符的ASCII码的十六进制表示。例如,"中文"经过URL编码后变成"%E4%B8%AD%E6%96%87"。

Base64编码

Base64编码是将非ASCII字符转换成一串由ASCII字符组成的字符串。例如,"中文"经过Base64编码后变成"5Lit5paH"。

在默认情况下,Java后台程序会将参数进行URL编码,而Java程序自动会进行URL解码。因此,当我们发送GET请求时,URL中的中文参数会被自动进行URL编码,而在接收端的Java程序会自动进行URL解码。这就导致了参数接收时中文乱码的问题。

解决方案

要解决参数接收时中文乱码的问题,我们需要在发送请求时进行手动编码,以及在接收请求时进行手动解码。下面是具体的解决方案。

发送请求时的编码

在发送GET请求时,我们可以使用Java中的URLEncoder类对参数进行URL编码。具体的代码如下所示:

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class HttpRequestSender {
    public static void main(String[] args) {
        try {
            String chinese = "中文";
            String encodedChinese = URLEncoder.encode(chinese, "UTF-8");
            String url = "http://localhost:8080/your-target-program?param=" + encodedChinese;

            // 发送HTTP GET请求
            // ...
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们使用URLEncoder.encode()方法将中文参数进行URL编码,并拼接到URL后面。这样,发送的GET请求就能正常传递中文参数了。

接收请求时的解码

在接收GET请求时,我们需要手动进行URL解码。具体的代码如下所示:

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

public class HttpRequestReceiver {
    public static void main(String[] args) {
        // 接收GET请求
        // ...

        String encodedChinese = request.getParameter("param");
        try {
            String decodedChinese = URLDecoder.decode(encodedChinese, "UTF-8");
            System.out.println(decodedChinese);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们使用URLDecoder.decode()方法对接收到的参数进行URL解码,然后就可以得到原始的中文参数了。

完整示例

为了更好地理解这个解决方案,我们可以看一个完整的示例。假设我们有一个Java后台程序用于发送GET请求,另一个Java后台程序用于接收GET请求。

发送GET请求的程序
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URLEncoder;
import java.net.URL;
import java.nio.charset.StandardCharsets;

public class HttpRequestSender {
    public static void main(String[] args) {
        try {
            String chinese = "中文";
            String encodedChinese = URLEncoder.encode(chinese, StandardCharsets.UTF_8.toString());
            String url = "http://localhost:8080/your-target-program?param=" + encodedChinese;

            URL targetUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection();
            connection.setRequestMethod("GET");

            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // 请求成功
                // ...
            } else {
                // 请求失败