Я пытаюсь реализовать Firebase Topic Messaging в приложении для Android, и я пытаюсь создать HTTP-запрос, и получаю код ответа 400. Я рассмотрел различные решения, но ни один из них помогли.
Здесь я вызываю подкласс AsyncTask:
try{new FirebaseSendMessage().execute("Hello world");}
catch (Exception e) {
Log.d("Exception", e.toString());
}
Вот мой подкласс класса Async Task.
class FirebaseSendMessage extends AsyncTask<String, Integer, Double> {
private final static String USER_AGENT = "Mozilla/5.0";
private final static String AUTH_KEY = "<My firebase authorization key obtained from firebase>";
private Exception exception;
protected Double doInBackground(String... params) {
try {
sendRequest(params);
} catch (Exception e) {
this.exception = e;
}
return null;
}
protected void onPostExecute(Long l) {
// TODO: check this.exception
// TODO: do something with the feed
}
public void sendRequest(String... params) {
try {
String urlString = "https://fcm.googleapis.com/fcm/send";
URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Authorization", "key=" + AUTH_KEY);
String postJsonData = "{\"to\": \"/topics/news\"\"data\": {\"message\": \"This is a Firebase Cloud Messaging Topic Message!\"}";
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(postJsonData);
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
System.out.println("POST Response Code :: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK){
System.out.println("succeeded");
}
/*InputStream is = con.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
//con.disconnect();*/
}
catch(IOException e){
Log.d("exception thrown: ", e.toString());
}
}
}
Ошибка: I/System.out: POST Response Code :: 400
Пожалуйста, дайте мне знать, если есть дополнительные фрагменты кода, необходимые для отладки. Спасибо заранее!
Ошибка 400 означает недопустимый JSON в вашем запросе:
Убедитесь, что сообщение JSON правильно отформатировано и содержит допустимые поля (например, убедитесь, что передан правильный тип данных).
В sendRequest
вы пропустили запятую (,
) между "news\"
и \"data\"
и закрывающей скобкой (}
):
String postJsonData = "{\"to\": \"/topics/news\"\"data\": {\"message\": \"This is a Firebase Cloud Messaging Topic Message!\"}";
который выглядит следующим образом:
{"to": "/topics/news/""data":{"message":"...."}
Должно быть:
String postJsonData = "{\"to\": \"/topics/news\", \"data\": {\"message\": \"This is a Firebase Cloud Messaging Topic Message!\"}}";
Итак, структура JSON будет правильной:
{"to": "/topics/news/",
"data":{"message":"..."}
}
Для тех, кто желает использовать ключ аутентификации в вашем приложении.
Я предлагаю зашифровать ключ вручную SHA-1 вашего приложения и расшифровать его во время выполнения с кодом SHA-1.
AUTH_KEY
свойAUTH_KEY
всем пользователям вашего приложения, а это значит, что он может (и будет) найден хакерами, которые затем смогут использовать его для отправки сообщений от имени вашего приложения.