简体   繁体   中英

Push notifications on a Python server with App engnine

I'm implementing a push notifications mechanism for my android app.

Right now I'm trying to run a small test just to see that I manage to send push notifications from a python server via http to GCM, and to recieve it successfuly in an android client.

Client code is exactly as in google's tutorial: http://developer.android.com/google/gcm/client.html

There's a main activity called DemoActivity which is responsible for registering or retrieving an already existed a registration id, and two classes GcmIntentService and GcmBroadcastReceiver responsible for handling the messags from the GCM server to the app.

Of course, I've set the SENDER_ID correctly, and I do manage to get a registration ID for my client app.

Now for the server:

In the server I always recieve the following error:

HTTP Error 401: Unauthorized

This is my server code:

    url = "https://android.googleapis.com/gcm/send"
    headers = { 'Content-Type' : 'application/json', 'Authorization': 'key=' + SERVER_API_KEY }
    values = { 'registration_ids': [CLIENT_REGID]
    , 'data': {'test': 'test} }


    data = urllib.urlencode(values)
    req = urllib2.Request(url, json.loads(values), headers)
    response = urllib2.urlopen(req)
    the_page = response.read()
    self.response.out.write(the_page)

For security reasons I omitted the server api key and the client registration id (they're hard-coded), but I double and triple checked them and they're correct. Also, I made sure the server API key was formed correctly (Credentials -> Create new key -> Server key) and also made sure "Any IP allowed".

All solutions I found on the internet was related to a mistake in the server api or something like that but I already checked that. Thanks for helpers!

edit:

added 'key=' in the header, but now I recieve Bad request error (HTTP code 400)

another edit:

changes the values object abit and sent it using json.loads, but not I have this error in the client (means it finally recieves a notification from server!!):

Unable to instantiate receiver GcmBroadcastReceiver

Any ideas? I copied the sample project from google as is, so I don't have any idea what's wrong here.

The auth header should be (note the key= part):

Authorization:key=<your_key_here>

so you should set headers like this:

headers = { 'Content-Type' : 'application/json', 'Authorization': 'key='+SERVER_API_KEY }

I believe the issue is that you're sending urlencoded payload, when telling the server to expect json. Try changing data to a json object, as a string: data ="{ 'registration_ids':...}"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM