Java 使用 UTF-8 发送 http POST

Aja*_*jay 2 java post http firebase-cloud-messaging

我需要使用 Google FCM 发送 HTTP POST。通过下面的代码,可以发送英文消息,但可以发送中文字符。我通过到处添加 UTF-8 进行了多次尝试...需要帮助。

\n\n

我的消息的有效负载是下面代码中的 str2。\nAndroid APP 中显示的结果是 \nHello+%E6%88%91

\n\n

E68891是正确的UTF-8代码,但我需要它显示为汉字。

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

Joh*_*uhn 5

有两个问题:

\n
    \n
  1. writeBytes: 正如 Java 文档所述:\n
    \n

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

    \n
    \n
  2. \n
\n

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

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

要解决此问题,请使用正确的方法传输数据:作为 utf-8,在 JSON 中不进行任何编码:

\n
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");\ncon.setRequestProperty("Accept-Charset", "UTF-8");\ncon.setRequestProperty("Authorization", "key=...............");\n\nString str1 = "{\\"to\\":\\"/topics/1\\",\\"notification\\":\\"title\\":\\"";\nString str2 = "Hello \xe6\x88\x91";\nString str3 = "\\"}}";\nString urlParameters = str1+str2+str3;\ncon.setDoOutput(true);\nOutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream(), "UTF-8");\n\nwr.write(urlParameters);\nwr.flush();\nwr.close();\ncon.getResponseCode();\n
Run Code Online (Sandbox Code Playgroud)\n