Java 使用 UTF-8 发送 http POST



我需要用Google FCM发送HTTP POST。使用下面的代码,可以发送英文消息,但中文字符。我通过在这里和那里添加 UTF-8 进行了许多试验......需要帮助。

我的消息的有效负载在下面的代码中是 str2。安卓APP中显示的结果是您好+%E6%88%91

E68891 是正确的 UTF-8 代码,但我需要将其显示为中文字符。

package tryHttpPost2;
import java.io.DataOutputStream;
import java.net.URL;
import java.net.URLEncoder;
import javax.net.ssl.HttpsURLConnection;
public class TryHttpPost2 
{
    public static void main(String[] args) throws Exception {
        String url = "https://fcm.googleapis.com/fcm/send";
        URL obj = new URL(url);
        HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-Type", "application/json;x-www-form-urlencoded;charset=UTF-8");
        con.setRequestProperty("Accept-Charset", "UTF-8");
        con.setRequestProperty("Authorization", "key=...............");
        String str1 = "{"to":"/topics/1","notification":{"title":"";
        String str2 = URLEncoder.encode("Hello 我", "utf-8");
        String str3 = ""}}";
        String urlParameters = str1+str2+str3;
        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();
        con.getResponseCode();
    }
}

有两个问题:

  1. writeBytes : 正如Java文档所说:

    对于每个字符,以完全按照 writeByte 方法的方式写入一个字节,即低位字节。忽略字符串中每个字符的高阶八位。

所以这种方法不能写 unicode 字符串。

  1. URLEncoder 旨在用于GET请求或内容类型为 application/x-www-form-urlencoded POST请求。但是您使用内容类型application/json传输数据。您以某种方式尝试在那里也使用 url 编码,但这不起作用。(有关更多信息,请参阅相关的 RFC(

要解决此问题,请使用正确的方法来传输数据:与 utf-8 一样,JSON 中没有任何编码:

con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
con.setRequestProperty("Accept-Charset", "UTF-8");
con.setRequestProperty("Authorization", "key=...............");
String str1 = "{"to":"/topics/1","notification":"title":"";
String str2 = "Hello 我";
String str3 = ""}}";
String urlParameters = str1+str2+str3;
con.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream(), "UTF-8");
wr.write(urlParameters);
wr.flush();
wr.close();
con.getResponseCode();

感谢库恩的大力帮助。这就是我现在所做的和工作。

  1. 让内容类型只是"application/json"。
  2. 让 str2 只是有效负载字符串。
  3. 将 writeBytes 的东西替换为 wr.write(urlParameters.getBytes("utf-8"((;
    1. 属性"接受字符集"在这里似乎毫无用处。无论有没有它都可以工作。

相关内容

  • 没有找到相关文章

最新更新