Erro HTTP 400 do Google Cloud Messaging:Pedido ruim
-
13-12-2019 - |
Pergunta
Estou tentando enviar uma mensagem através do GCM (Google Cloud Messaging).Eu me registrei por meio das APIs do Google e posso enviar um regID para meu site (que é um back-end do Google App Engine) de vários telefones de teste Android.No entanto, não consigo enviar nada para o GCM do Google App Engine.Aqui está o que estou tentando usar.
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)
E aqui está o erro que estou recebendo.
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
Obrigado!
Solução
Para que são usados data2 e data3?Os dados que você está postando não eram json adequados, então você precisa usar json.dumps(data).O código deve ser assim:
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")
Outras dicas
Tente usar python-gcm.Ele também pode lidar com erros.
Foi assim que acabei resolvendo, mas o acima também funciona.
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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow