Не удалось отправить пакетные сообщения с помощью Firebase REST API. - PullRequest
1 голос
/ 04 мая 2020

Я экспериментирую с REST API для отправки пакетных сообщений в Firebase Cloud Messaging. Я подготовил составной HTTP-запрос в C#:

using var request = new HttpRequestMessage(HttpMethod.Post, "https://fcm.googleapis.com/batch");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "xxx");
request.Content = new StringContent(multicast);
request.Content.Headers.Remove("Content-Type");
request.Content.Headers.TryAddWithoutValidation("Content-Type", "multipart/mixed; boundary=--subrequest_boundary");
var response = await FcmHttpClient.SendAsync(request);

Строковое значение поля multicast выше представляет собой HTTP-контент, аналогичный представленному в документации Firebase :

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer xxx

POST /v1/projects/myproject/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "topic":"global",
     "notification":{
       "title":"FCM Message",
       "body":"This is an FCM notification message to device 0!"
     }
  }
}

--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
Authorization: Bearer xxx

POST /v1/projects/myproject/messages:send
Content-Type: application/json
accept: application/json

{
  "message":{
     "topic":"readers-club",
     "notification":{
       "title":"Price drop",
       "body":"2% off all books"
     }
  }
}

--subrequest_boundary--

Сервер Firebase возвращает неверный запрос-400 с сообщением об ошибке: "Failed to parse batch request, error: 0 items. Received batch body: --subrequest_boundary--", которое указывает, что Firebase напрямую обрабатывает контент с завершающим --subrequest_boundary--.

Что могло быть причиной проблема?

Ответы [ 2 ]

0 голосов
/ 17 июля 2020

Попробуйте сменить код

request.Content.Headers.TryAddWithoutValidation("Content-Type", "multipart/mixed; boundary=--subrequest_boundary");

на

request.Content.Headers.TryAddWithoutValidation("Content-Type", "multipart/mixed; boundary=subrequest_boundary");
0 голосов
/ 06 мая 2020

Дьявол в деталях строительства Content. Вы не можете просто создать строку, соответствующую этой полезной нагрузке, потому что некоторые ее части, такие как заголовки и границы, технически не считаются частью тела стеком HttpClient.

Если вам действительно нужно сделайте это с необработанным HttpClient, посмотрите , как Google APIs. NET клиент создает и отправляет пакетный запрос . Но я подозреваю, что как только вы поймете, насколько это громоздко, вы придете к выводу, что лучше всего использовать SDK более высокого уровня, например firebase-admin-do tnet, который является упомянутый в той же документации, на которую вы ссылаетесь, и использует клиент Google. NET под капотом.

...