Google Cloud Messaging Ошибка HTTP 400: неверный запрос

Я пытаюсь отправить сообщение через GCM (Google Cloud Messaging). Я зарегистрировался через Google API, я могу отправить regID на свой веб-сайт (который является серверной частью Google App Engine) с нескольких тестовых телефонов Android. Однако я не могу ничего отправить в GCM из Google App Engine. Вот что я пытаюсь использовать.

    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)

И вот ошибка, которую я получаю.

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

Спасибо!


person Andy    schedule 28.07.2012    source источник


Ответы (3)


Для чего используются данные2 и данные3? Данные, которые вы публикуете, не были правильными json, поэтому вам нужно использовать json.dumps(data).Code должен быть таким:

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")
person user1170793    schedule 20.08.2012

Попробуйте использовать python-gcm. Он также может обрабатывать ошибки.

person Nam Ngo    schedule 03.11.2012

Вот как я решил это, но вышеизложенное тоже работает.

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()
person Andy    schedule 20.11.2012
comment
Похоже, вы используете комбинацию форматов json и открытого текста. Выбери один. developer.android.com/guide/google/gcm/gcm.html# сервер - person Albert; 30.11.2012