我需要用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();
}
}
有两个问题:
-
writeBytes
: 正如Java文档所说:对于每个字符,以完全按照 writeByte 方法的方式写入一个字节,即低位字节。忽略字符串中每个字符的高阶八位。
所以这种方法不能写 unicode 字符串。
-
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();
感谢库恩的大力帮助。这就是我现在所做的和工作。
- 让内容类型只是"application/json"。
- 让 str2 只是有效负载字符串。
- 将 writeBytes 的东西替换为 wr.write(urlParameters.getBytes("utf-8"((;
- 属性"接受字符集"在这里似乎毫无用处。无论有没有它都可以工作。