2012-07-28 59 views
10

Sto tentando di inviare un messaggio tramite GCM (Google Cloud Messaging). Mi sono registrato tramite le API di Google, posso inviare un regID al mio sito Web (che è un back-end di Google App Engine) da più telefoni di prova Android. Tuttavia, non posso inviare nulla a GCM da Google App Engine. Ecco cosa sto cercando di usare.Errore di cloud di Google Cloud Messaging 400: Richiesta errata

regId = "APA91b..." 

    json_data = {"collapse_key" : "Food-Promo", "data" : { 
        "Category" : "FOOD", 
        "Type": "VEG", 
       }, "registration_ids": [regId], 
    } 


    url = 'https://android.googleapis.com/gcm/send' 




    apiKey = "AI..." 
    myKey = "key=" + apiKey 

    headers = {'Content-Type': 'application/json', 'Authorization': myKey} 
    data = urllib.urlencode(json_data) 
    data2 = {"title": title} 
    data3 = urllib.urlencode(data2) 

    req = urllib2.Request(url, data, headers) 


    f = urllib2.urlopen(req) 
    response = f.read() 
    f.close() 

    logging.debug("***!!!!!!!WriteEntry TEST ----- Response: " + response) 

Ed ecco l'errore che sto ricevendo.

Traceback (most recent call last): 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py", line 703, in __call__ 
    handler.post(*groups) 
    File "/base/data/home/apps/s~journaltestza/26.360625174851783344/main.py", line 213, in post 
    f = urllib2.urlopen(req) 
    File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 124, in urlopen 
    return _opener.open(url, data) 
    File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 387, in open 
    response = meth(req, response) 
    File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 498, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 425, in error 
    return self._call_chain(*args) 
    File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 360, in _call_chain 
    result = func(*args) 
    File "/base/python_runtime/python_dist/lib/python2.5/urllib2.py", line 506, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
HTTPError: HTTP Error 400: Bad Request 

Grazie!

risposta

9

A cosa servono i dati 2 e 3? I dati che si sta scrivendo non era adeguata JSON quindi è necessario utilizzare json.dumps (dati) .Codice dovrebbe essere come questo:

json_data = {"collapse_key" : "Food-Promo", "data" : { 
       "Category" : "FOOD", 
       "Type": "VEG", 
      }, "registration_ids": [regId], 
} 


url = 'https://android.googleapis.com/gcm/send' 
apiKey = "AI..." 
myKey = "key=" + apiKey 
data = json.dumps(json_data) 
headers = {'Content-Type': 'application/json', 'Authorization': myKey} 
req = urllib2.Request(url, data, headers) 
f = urllib2.urlopen(req) 
response = json.loads(f.read()) 
reply = {} 
if response ['failure'] == 0: 
    reply['error'] = '0' 
else: 
    response ['error'] = '1' 
return HttpResponse(json.dumps(reply), mimetype="application/javascript") 
1

Provare a usare python-gcm. Può gestire anche gli errori.

0

Ecco come ho finito per risolverlo, ma funziona anche sopra.

def sendGCM(self, regid, email, entry_id, date_modified, kind): 


    url = 'https://android.googleapis.com/gcm/send' 
    apiKey = _MY_API_KEY 
    myKey = "key=" + apiKey 

    json_data = { "registration_id": regid, "data" : { 
     "entry_id" : entry_id, 
     "email": email, 
     "date_modified": date_modified, 
     "kind": kind, 
     "reg_id": regid, 
     }, 
    } 

    ### Get regids 
    registration_data = { 
     "registration_ids": [regid], 
    } 

    headers = {'Content-Type': 'application/json', 'Authorization': myKey} 
    data = urllib.urlencode(json_data)    
    req = urllib2.Request(url, data) 
    req.add_header("Authorization", myKey)    

    f = urllib2.urlopen(req) 
    response = f.read() 
    f.close() 
+0

Sembra che tu stia utilizzando una combinazione di formati JSON e testo normale. Sceglierne uno. http://developer.android.com/guide/google/gcm/gcm.html#server – Albert

Problemi correlati