Can I use POSTMAN client on Google Chrome to send payload message to GCM server for testing purpose.
Secondly if yes, what is the header and url parameter to be sent.
Yes, you can.
1. Send a notification with a JSON payload
URL: https://android.googleapis.com/gcm/send
Headers:
Authorization: key=<your-api-key>
Content-Type: application/json
Body (click on the 'raw' tab):
{
"collapse_key": "score_update",
"time_to_live": 108,
"delay_while_idle": true,
"data": {
"score": "4x8",
"time": "15:16.2342"
},
"registration_ids":["4", "8", "15", "16", "23", "42"]
}
Note: registration_ids is the only required field, all the others are optional.
2. Send a notification with a plain text payload
URL: https://android.googleapis.com/gcm/send
Headers:
Authorization: key=<your-api-key>
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
Body (click on the 'x-www-form-urlencoded' tab):
collapse_key=score_update
time_to_live=108
delay_while_idle=1
data.score=4x8
data.time=15:16.2342
registration_id=42
Note: registration_id is the only required field, all the others are optional.
Source: https://developer.android.com/google/gcm/http.html
Just for the record and to complete the nice answer from #Alexandru Rosianu the GCM endpoint changed a while ago and it is suggested to use the new one. Here is an example taken from the official docs:
Authentication
To send a message, the application server issues a POST request. For example:
https://gcm-http.googleapis.com/gcm/send
A message request is made of 2 parts: HTTP header and HTTP body.
The HTTP header must contain the following headers:
Authorization: key=YOUR_API_KEY
Content-Type: application/json for JSON; application/x-www-form-urlencoded;charset=UTF-8 for plain text. If Content-Type is omitted, the format is assumed to be plain text.
For example:
Content-Type:application/json
Authorization:key=YOUR_API_KEY
{
"notification": {
"title": "Portugal vs. Denmark",
"text": "5 to 1"
},
"to" : "bk3RNwTe3H0:CI2k_H..."
}
The HTTP body content depends on whether you're using JSON or plain text. See the Server Reference for a list of all the parameters your JSON or plain text message can contain.
Example using Curl:
# curl --header "Authorization: key=YOUR_API_KEY" \
--header Content-Type:"application/json" \
https://gcm-http.googleapis.com/gcm/send \
-d "{\"notification\": { \"title\": \"Portugal vs. Denmark\"," \
"\"text\": \"5 to 1\" }, \"to\" : \"bk3RNwTe3H0:CI2k_H...\" }"
Yes, you can use POSTMAN.
This GCM Notification Test Tool simplifies the server side testing immensely by reducing the number of items you enter in POSTMAN everytime - http://techzog.com/development/gcm-notification-test-tool-android/
Related
To sending push notification messages via google FCM api currently I use postman with a json syntax like this:
{
"condition":"my condition",
"notification":{
"title" : "the title",
"body":"the body"
}
}
and it is ok. and if I need to send 2 messages so I have to send messages separately by 2 post call. like this:
{
"condition":"my condition",
"notification":{
"title" : "the title 1",
"body":"the body 1"
}
}
---> pressing send button
{
"condition":"my condition",
"notification":{
"title" : "the title 2",
"body":"the body 2"
}
}
---> pressing send button
and is ok too. but the problem is I have 2 network overheads for sending this messages.
Is there any syntax to send multiple messages by one post request?
I read and I know about the sending to multiple devices and so on... that is not my problem. my problem is : sending 2 or more messages in one post request.
The FCM SDK has an option for batching requests which will let you group messages into a single batch and send them im a single call. For REST request, you can make a list of sub requests:
--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"FCM Message",
"body":"This is an FCM notification message to device 0!"
}
}
}
--subrequest_boundary
Content-Type: application/http
Content-Transfer-Encoding: binary
POST /v1/projects/myproject-b5ae1/messages:send
Content-Type: application/json
accept: application/json
{
"message":{
"topic":"readers-club",
"notification":{
"title":"Price drop",
"body":"2% off all books"
}
}
}
I try to implement push-notifications to my Ionic4-Capacitor-App.
In the app I have this code:
PushNotifications.register();
PushNotifications.createChannel({ id: '1', description: '2019', importance: 2, name: '2019'});
PushNotifications.addListener('pushNotificationReceived', (notification) => {
console.debug(JSON.stringify(notification));
});
With POSTMAN I try to send the following message:
{
"to": "<User-Token>",
"notification": {
"title": "Default Title",
"body": "Default Body"
},
"android": {
"notification": {
"title": "Android Title",
"body": "Android Title",
"channel_id": "1"
}
}
}
Here is the documentation I used.
The notification I recive has "Default Title" as a title and "Default Body" as a body.
I expected it to have "Android Title" and "Android Body". Additionally, the notification is not pushed to channel 1, but to Miscellaneous.
When I leave out the "root" notification part, no notification is displayed at all.
For everyone who faces the same problem:
Here are the configuration steps I made to send firebase cloud messages via Postman.
Google-Cloud Configuration:
Go To: https://console.cloud.google.com/apis/credentials/consent
Add getpostman.com to the authorized domains
Go To: https://console.cloud.google.com/apis/credentials
Add a new OAuth-Client-ID
Select Webapplication and give it a name.
Set authorized redirect-URL to https://www.getpostman.com/oauth2/callback and save.
Download Json for this account
POSTMAN Configuration:
Set Request-Type to POST
Enter the url: https://fcm.googleapis.com/v1/projects/{your-firebase-project-name}/messages:send
Go to Authorization, select type OAuth 2.0 and click "Get New Access Token"
Grant-Type Authorization Code
Callback URL: https://www.getpostman.com/oauth2/callback
Auth URL: [auth_uri from the json File]
Access Token URL: [token_uri from the json File]
Client ID: [client_id from the json File]
Client Secret: [client_secret from the json File]
Scope: https://www.googleapis.com/auth/firebase.messaging
State: [empty]
Client Authentication: Send as Basic Auth header
When you have done these steps, you should be able to Send messages as described in this documentation: https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages/send
with Parse.com I used to be able to send push notifications via simple https post requests, something like:
{
"registration_ids": ["some_device_token_from_the_dashboard"],
"data": { "title": "How are you", "message": "Ok?" }
}
I added a json content type and set Authorization to key=server_key.
Another tool that could be used is: http://www.androidbegin.com/tutorial/gcm.html
Anyway, I'm working with the android SDK v4.13.1 and Parse-server v2.2.16, when I use the dashboard to send push notification to everyone I get the notification, but when I try the post request that used to work with parse.com, the response is:
{
"multicast_id": 8851650859439498656,
"success": 1, "failure": 0,
"canonical_ids": 0,
"results":[ { "message_id": "0:1470077514727128%33b2cdf9f9fd7ecd" } ]
}
It looks like all is find but I don't get the notification at all, btw at the google console I didn't set the IP field so it accepts requests from 0.0.0.0(all interfaces), I assume there something I'm missing here, should the post request be different, what am I doing wrong?, is that a bug or?...
Edit:
Just to clerify, I implement my on PushReceiver that extends ParsePushBroadcastReceiver, and as before when I try to send push via simple post request(using my server-key and registration id) it won't work(the onPushReceive method never called).
POST request details:
My endpoint is https://android.googleapis.com/gcm/send(I did try gcm-http.googleapis.com/gcm/send as well)(https://developers.google.com/cloud-messaging/http for more details), Content-Type set to application/json and Authorization set to key=server_key, the content is given at the beginning of the question.
Is it possible to send push notification with REST API on Firebase? I can send notifications with Firebase console but i need to send notifications with REST API.
Just for helping,
If anyone wants to use REST POST API, here it is, use the Postman with below configuration
URL:
https://fcm.googleapis.com/fcm/send
Header:
"Content-Type": "application/json",
"Authorization": "key=<Server_key>"
BODY:
{
"to": "<Device FCM token>",
"notification": {
"title": "Check this Mobile (title)",
"body": "Rich Notification testing (body)",
"mutable_content": true,
"sound": "Tri-tone"
},
"data": {
"url": "<url of media image>",
"dl": "<deeplink action on tap of notification>"
}
}
That's it. Thanks!!!
If you want to get more details about Rich Notification with FCM, you can check my article on Medium Rich Push Notification with Firebase Cloud Messaging (FCM) and Pusher on iOS platform
I used the below rest API to send notification.
curl -X POST \
https://fcm.googleapis.com/fcm/send \
-H 'Authorization: key=AAAAG-oB4hk:APA91bFUilE6XqGzlqtr-M-LRl1JisWgEaSDfMZfHuJq3fs7IuvwhjoGM50i0YgU_qayJA8FKk15Uvkuo7SQtQlVt4qdcrrhvnfZyk_8zRGAskzalFUjr2nA2P_2QYNTfK6X8GbY0rni' \
-H 'Content-Type: application/json' \
-H 'Postman-Token: c8af5355-dbf2-4762-9b37-a6b89484cf07' \
-H 'cache-control: no-cache' \
-d '{
"to": "ey_Bl_xs-8o:APA91bERoA5mXVfkzvV6I1I8r1rDXzPjq610twte8SUpsKyCuiz3itcIBgJ7MyGRkjmymhfsceYDV9Ck-__ObFbf0Guy-P_Pa5110vS0Z6cXBH2ThnnPVCg-img4lAEDfRE5I9gd849d",
"data":{
"body":"Test Notification !!!",
"title":"Test Title !!!"
}
}'
Authorization : key=AAAAG-oB4hk:APA91bFUilE6XqGzlqtr-M-LRl1JisWgEaSDfMZfHuJq3fs7IuvwhjoGM50i0YgU_qayJA8FKk15Uvkuo7SQtQlVt4qdcrrhvnfZyk_8zRGAskzalFUjr2nA2P_2QYNTfK6X8GbY0rni
where key is web_server_key from the console and you need to specify the unique registration key which you will get from the app.
"to": "ey_Bl_xs-8o:APA91bERoA5mXVfkzvV6I1I8r1rDXzPjq610twte8SUpsKyCuiz3itcIBgJ7MyGRkjmymhfsceYDV9Ck-__ObFbf0Guy-P_Pa5110vS0Z6cXBH2ThnnPVCg-img4lAEDfRE5I9gd849d" is the FCM registration token from device. Please refer to the below link.
https://firebase.google.com/docs/cloud-messaging/android/client?authuser=0
this may help - https://firebase.google.com/docs/cloud-messaging/http-server-ref
where sample message you can find here - https://firebase.google.com/docs/cloud-messaging/downstream
from Firebase console you can get Server Key as an authorization you put in the http header, in the tab Cloud messaging.
Using ARC For Sending Request to Firebase Console To Send Notification
You can use ARC OR Postman or your own server to send notification.
You need to collect your web_server_key from the console and you need to specify the unique registration key which you will get from the app when calling the onRefreshToken() method.
You need to send the request to https://fcm.googleapis.com/fcm/send with Content-Type : json and Authorization: web_server_key. On To value user your app_registration_token .
Try this,
URL - https://fcm.googleapis.com/fcm/send
Method - Post
Headers
Authorization -> key= Server Key which you can get it from console
Content-Type -> application/json
Body
{
"to" : "FCM Token goes here",
"notification" : {
"body" : "New Lesson Added 1",
"title": "Lokesh"
}
}
We used the following documentation to send notifications from a web client.
There is an easy way to send a notification via Chrome App or Extension.
function sendMessage() {
var message = {
messageId: getMessageId(),
destinationId: senderId + "#gcm.googleapis.com",
timeToLive: 86400, // 1 day
data: {
"key1": "value1",
"key2": "value2"
}
};
chrome.gcm.send(message, function(messageId) {
if (chrome.runtime.lastError) {
// Some error occurred. Fail gracefully or try to send
// again.
return;
}
The new version of API (called v1) creates more challenges to send a message via ARC. You need a special token, which will expire. You have to create firebase admin sdk key(service account key) in firebase console:
Firebase-admin sdk
They key is stored in json format something like this:
{
"type": "service_account",
"project_id": "<your project ID>",
"private_key_id": "8b..............................37",
"private_key": "-----BEGIN PRIVATE KEY-----
MIIE.....
....
-----END PRIVATE KEY-----\n",
"client_email": "firebase-adminsdk-6fzie#<yourprojectID>.iam.gserviceaccount.com",
"client_id": "1...................4",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url":
"https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-
6fzie%40<yourprojectID>.iam.gserviceaccount.com"
}
The key is used to identify you while obtaining token for http communication. You need a kind of server access to firebase. I have used python in WSL with this piece of code:
import requests
import google.auth.transport.requests
from google.oauth2 import service_account
SCOPES = ['https://www.googleapis.com/auth/firebase.messaging']
credentials = service_account.Credentials.from_service_account_file('service-account.json', scopes=SCOPES)
request = google.auth.transport.requests.Request()
credentials.refresh(request)
print(credentials.token)
Where service-account.json is your private key in file on your filesystem where python is running. You will get the token and it could be used inside ARC:
ya29.c.b0Aa9VdylWfrAFWysdUeh3m7cGF-Cow1OAyyE4bEqFL....................48Ye7w
ARC config is similar like in legacy API, but there are some changes. The URL has changed and it contains your project ID:
https://fcm.googleapis.com/v1/projects/<your project ID>/messages:send
We still use POST method and headers have only one line Content-Type application/json. The authentication has a separated tab and we are supposed to use Bearer + token from python:
Firebase authentication
It is important to select Bearer and enable it, because it is disabled by default.
The changes are in the body as well. This is an example of the message to individual application based on application token:
{
"message" : {
"token" : "e6e....FurF",
"notification" : {
"body" : "Great deal!",
"title" : " Buy everything"
}
}
}
where keyword "to" has changed to "token". That's all and we can send the message to the app. I wanted to have it here to be able to migrate to API v1 as Goggle requires these days. The last piece of code is for curl:-)
curl " https://fcm.googleapis.com/v1/projects/<your project id>/messages:send" \
-X POST \
-d "{\r\n \"message\" : {\r\n \"token\" : \"e6e....FurF\",\r\n \"notification\" : {\r\n \"body\" : \"Great deal!\",\r\n \"title\" : \" Buy everything\"\r\n }\r\n }\r\n}" \
-H "Content-Type: application/json" \
-H "authorization: Bearer ya29.c.b...."
Here is source I have used:
Firebase cloud messaging doc
GIT HUB code for messaging
For c# application (Xamarin.Forms etc.) you can just copy this code:
public async static void SendPushToTokenID(string tokenID, string title, string body)
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json");
var url = serverURL;
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=" + serverKey);
var notification = new
{
title = title,
body = body
};
var postModel = new
{
to = tokenID,
notification = notification
};
var response = await client.PostAsJsonAsync(url, postModel);
// format result json into object
string content = await response.Content.ReadAsStringAsync();
string xw = (response.Content.ReadAsStringAsync().Result);
}
for url use: https://fcm.googleapis.com/fcm/send
and for your server key use your firebase server key. thats literally all. just dont forget to store the device token ID on your server and then you can send messages all day for free to individual users. its dead simple.
I am sending the following JSON through GCM (Google Cloud Messaging) but I have not been able to get the right response data through the Client. I get a push notification response, but the title is the App's name, and the texts reads: "message" so I can't display my notification properly.
Here is the JSON that I am trying to send:
{
"to": "somekey",
"notification": {
"body":"Test",
"title":"Test"
},
"data": null
}
I think that your problem is on the key-values of the payload of your message.
As you can see at GCM Server documentation, the payload can be set using two different keys:
data: This parameter specifies the key-value pairs of the message's payload.
notification: This parameter specifies the key-value pairs of the notification payload.
You should use the data key and set inside the payload of the notification. Once send, you can print the result of the notification received and see that there are the right payload inside the data key.
Your message should be like the following JSON data:
{
"registration_ids" => "some_target_device_id",
"data": {
"title": "My title",
"message": "This is the message!",
}
}
Authorization: key= AIz......#GCM project key
{ "data": {
"title": "Summer Offer.",
"message": "Click to visit the offer."
},
"to" : "Device Token"
}