Отправить push-уведомление через Firebase с устройства Android

#android #firebase #push-notification #retrofit #okhttp

#Android #firebase #push-уведомление #модернизация #okhttp

Вопрос:

Мне интересно отправить push-уведомление через Firebase из приложения для Android. В документации Firebase указано, что полезная нагрузка json должна быть отправлена наhttps://fcm.googleapis.com/fcm/send

Итак, я использую с помощью Retrofit для отправки json, но запрос завершается неудачей, и если я отправляю запрос без модернизации, он работает идеально.

В чем разница между реализациями tow и почему это не работает с Retrofit.

Вот две реализации и ошибка при использовании модернизации.

 val notificationBody = NotificationBody(notificationData, "/topics/all")
    val rb = Gson().toJson(notificationBody).toRequestBody("application/json".toMediaTypeOrNull())
    val responeNoti = RetrofitManager.notificationServiceApi.postNotification(rb)
    responeNoti.enqueue(object : Callback<ResponseBody>{
        override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
            Log.d(TAG, t.message)
        }

        override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
            Log.d(TAG, response.toString())
        }

    })
  

NotificationServiceApi

  private const val FCM_URL = "https://fcm.googleapis.com/fcm/"
val notificationServiceApi: ServiceApi by lazy{
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        val okHttpClientBuilder = OkHttpClient.Builder()
        okHttpClientBuilder.addInterceptor(object : Interceptor{
            override fun intercept(chain: Interceptor.Chain): okhttp3.Response {
                val request: Request = chain.request().newBuilder().
                addHeader("Content-Type", "application/json").
                addHeader("Authorization","key=*my firebase key*").build()

                return chain.proceed(request)
            }
        }).addInterceptor(interceptor)

        val notificationRetrofit = Retrofit.Builder()
            .client(okHttpClientBuilder.build())
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl(FCM_URL)
            .build()
        notificationRetrofit.create(ServiceApi::class.java)
    }
  

ServiceApi

 @POST("send/")
fun postNotification(@Body notificationBody: RequestBody) : Call<ResponseBody>
  

Журнал Http

 2020-09-06 00:12:27.991 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: --> POST 
        https://fcm.googleapis.com/fcm/send/
2020-09-06 00:12:27.991 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: Content- 
Length: 117
    2020-09-06 00:12:27.991 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: Content-Type: application/json
    2020-09-06 00:12:27.991 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: Authorization: key=my firebase key
    2020-09-06 00:12:27.991 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: {"data":{"imageUrl":"https://i.imgur.com/KA1jrU7.jpg","textBody":"my content","title":"my title"},"to":"/topics/all"}
    2020-09-06 00:12:27.991 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: --> END POST (117-byte body)
    2020-09-06 00:12:29.198 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: <-- 404 https://fcm.googleapis.com/fcm/send/ (1206ms)
    2020-09-06 00:12:29.198 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: content-type: text/plain; charset=utf-8
    2020-09-06 00:12:29.198 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: x-content-type-options: nosniff
    2020-09-06 00:12:29.198 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: x-frame-options: SAMEORIGIN
    2020-09-06 00:12:29.198 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: x-xss-protection: 0
    2020-09-06 00:12:29.198 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: date: Sat, 05 Sep 2020 21:12:29 GMT
    2020-09-06 00:12:29.198 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: content-length: 135
    2020-09-06 00:12:29.198 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: alt-svc: h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
    2020-09-06 00:12:29.199 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: A valid push subscription endpoint should be specified in the URL as such: https://fcm.googleapis.com/wp/dHIoDxE7Hdg:APA91bH1Zj0kNa...
    2020-09-06 00:12:29.199 32059-32244/com.bagi.soreknetmanager I/okhttp.OkHttpClient: <-- END HTTP (135-byte body)
    2020-09-06 00:12:29.201 32059-32059/com.bagi.soreknetmanager D/MainActivity: Response{protocol=h2, code=404, message=, url=https://fcm.googleapis.com/fcm/send/}
  

Реализация, которая отлично работает без использования модернизации

  val notificationBody = NotificationBody(notificationData, "/topics/all")
    val jsonPayload = createJsonFromObject(notificationBody)
     val thread = Thread(Runnable {
    try {
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        var client = OkHttpClient().newBuilder().addInterceptor(interceptor)
            .build()
        var mediaType = "application/json".toMediaTypeOrNull()
        var body: RequestBody = RequestBody.create(
            mediaType,
            jsonPayload
        )
        var request: Request = Request.Builder()
            .url("https://fcm.googleapis.com/fcm/send")
            .method("POST", body)
            .addHeader("Content-Type", "application/json")
            .addHeader(
                "Authorization",
                "key=my firebase key"
            )
            .build()
        var response: okhttp3.Response = client.newCall(request).execute()
    } catch (e: Exception) {
        e.printStackTrace()
    }
})

thread.start()
  

Ответ №1:

Ошибка в вашем URL.. Проверьте свой FCM_URL, он неполный, вы забыли добавить слово «отправить»

 FCM_URL = "https://fcm.googleapis.com/fcm/"
  

Правильный URL-

 FCM_URL ="https://fcm.googleapis.com/fcm/send"
  

Комментарии:

1. Нет, URL правильный, вы можете увидеть продолжение пути. @POST(«отправить/»). Кроме того, в журнале http отображается полный URL-адрес. 2020-09-06 00:12:27.991 32059-32244/com.bagi.soreknetmanager I/okhttp. OkHttpClient: —> ОПУБЛИКОВАТЬ fcm.googleapis.com/fcm/send