Почтовый запрос HTTP: ошибка 400, обмен сообщениями в темах Firebase

1

Я пытаюсь реализовать 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

Пожалуйста, дайте мне знать, если есть дополнительные фрагменты кода, необходимые для отладки. Спасибо заранее!

  • 2
    Пожалуйста, не включайте этот код в ваше приложение для Android. Вы AUTH_KEY свой AUTH_KEY всем пользователям вашего приложения, а это значит, что он может (и будет) найден хакерами, которые затем смогут использовать его для отправки сообщений от имени вашего приложения.
  • 0
    Похоже, что Firebase требует от меня, чтобы сделать это так. Есть ли обходной путь?
Показать ещё 1 комментарий
Теги:
firebase
http
firebase-cloud-messaging
http-post

2 ответа

3
Лучший ответ

Ошибка 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":"..."}
}
  • 1
    Спасибо, это была ошибка.
  • 0
    Это на самом деле странно - у нас было решение в течение нескольких месяцев, и теперь мы получаем 400 ошибок ... все еще расследуем
0

Для тех, кто желает использовать ключ аутентификации в вашем приложении.

Я предлагаю зашифровать ключ вручную SHA-1 вашего приложения и расшифровать его во время выполнения с кодом SHA-1.

  • 0
    это займет всего несколько минут, чтобы получить ключ. вы не должны иметь его в клиентском приложении, если вы не хотите, чтобы люди испортили ваше приложение. пользовательский сервер или другие методы доступа через Firebase.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню