Как отправить HTTP POST в GCM с помощью AS3 (обмен облачными сообщениями Google для Android)

Я пытаюсь сделать HTTP-запрос к GCM из сценария действий в своем приложении AIR ANDROID. Что я делаю не так? Я следую запросу форматировать здесь.

Я продолжаю получать ошибку 400 обратно

var url:String = "https://android.googleapis.com/gcm/send";

var request:URLRequest = new URLRequest(url);

var rhArray:Array = new Array(new URLRequestHeader("Content-Type", "application/json"),new URLRequestHeader("Authorization", "key=MYAPIKEY"));
            request.requestHeaders = rhArray;

var msgData:String = JSON.stringify({"message":"holy crap message worked","title":"the message title here"});
var postData:String = JSON.stringify({"registration_ids":["THELONGREGISTRATIONIDOFTHEDEVICEIWANTTOMESSAGE"],"data":msgData});

request.data = postData;
request.method = URLRequestMethod.POST;

var urlLoader:URLLoader = new URLLoader();
urlLoader = new URLLoader();

urlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler, false, 0, true);
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler, false, 0, true);

urlLoader.load(request);

person brybam    schedule 23.03.2013    source источник


Ответы (2)


Если вы получаете код состояния HTTP 401, ваш ключ API недействителен. Итак, предполагая, что у вас есть действительный ключ API, первое, что вам нужно исправить, это изменить

"Authorization", "MYAPIKEY"

to

"Authorization", "key=MYAPIKEY"

Если вы получаете код состояния HTTP 400, ваш JSON недействителен. Убедитесь, что это выглядит так:

{ "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"]
}

Возможно, вам не хватает некоторых кавычек (похоже, ваши ключи не имеют кавычек).

person Eran    schedule 23.03.2013
comment
Эй, спасибо за ответ. К сожалению, когда вы опубликовали свой ответ, я просто обновлял свой вопрос. Я только что увидел, что ключ = нужно добавить. Это все еще не работает. У меня сейчас ошибка 400. Но без другой информации в объекте события. Может, есть другие идеи? - person brybam; 23.03.2013
comment
Я только что обновил выше, чтобы показать, как это у меня есть. Поскольку я просто отправляю на 1 регистрационный идентификатор, у меня есть [THELONGID]. Кроме того, я заметил, отслеживаю ли я свою строку. Перед кавычками вроде \" много слэшей. Должен ли я как-то это остановить? - person brybam; 23.03.2013
comment
Можете ли вы распечатать свою переменную postData? Из вашего кода выше похоже, что вы не цитируете свои ключи (данные должны быть данными, Registration_ids должны быть Registration_ids и т.д...) - person Eran; 23.03.2013
comment
Я пошел дальше и попробовал то, что вы предложили, но все равно не повезло. У меня их просто не было, потому что я думал, что для этого и нужен JSON.stringify. Даже с добавленными кавычками все равно получите тот же ответ. - person brybam; 23.03.2013
comment
@brybam Что ж, если вы распечатаете свой JSON (postDataariable), я смогу сказать вам, в чем проблема. - person Eran; 23.03.2013

У меня также были проблемы с прохождением кода состояния 400 HTTP. Я попытался реализовать эту функциональность с помощью кода от brybam, и, как указано в ответе, код 400 означает, что часть JSON HTTP-запроса недействительна.

Замените эти две строки из первого поста brybam:

var msgData:String = JSON.stringify({"message":"holy crap message worked","title":"the message title here"});

var postData:String = JSON.stringify({"registration_ids":["THELONGREGISTRATIONIDOFTHEDEVICEIWANTTOMESSAGE"],"data":msgData});

С этими:

var msgData:String = JSON.stringify({data:{message:"holy crap message worked",title:"the message title here"}});

var postData:String = JSON.stringify({registration_ids:["THELONGREGISTRATIONIDOFTHEDEVICEIWANTTOMESSAGE"]});

// remove the first curly bracket of msgData since we will concatenate the two strings in a moment.

msgData = msgData.slice(1,msgData.length);

// remove the last curly bracket of postData too.

postData = postData.slice(0, postData.length-1);

// concatenate the two, separated by a comma.

postData = postData.concat(",",msgData);

Это сработало для меня, если вы проследите переменную postData, вы увидите, что JSON теперь правильно отформатирован. Привет, Клаус

person Kramer    schedule 04.02.2014