C2DM 411. Это ошибка. Запросы POST требуют заголовка Content-length.

Я работаю над push-уведомлением, которое делает пользователя C2DM. Мне удалось получить идентификатор регистрации пользователя, токен аутентификации от Google. Но когда я пытаюсь отправить сообщение, я получаю эту ошибку от Google «411. Это ошибка. Для запросов POST требуется заголовок Content-length».

function send($deviceRegistrationId, $msgType, $messageText) {
$f = fopen('request.txt', 'w');
$reg_id = $deviceRegistrationId; // Registration ID
$device_id = "1"; 

$data = array(
'registration_id' => trim($reg_id),
'collapse_key' => 'ck_'.trim($device_id),
'data.arg' => trim($messageText)
);
$dataStr = http_build_query($data);

$headers = array(
'Authorization: GoogleLogin auth='.$_SESSION['google'],
'Content-Type: application/x-www-form-urlencoded',
'Content-Length: '.strlen($dataStr)
);

// Prepare the cURL request
$ch = curl_init();
curl_setopt($ch,            CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
curl_setopt($ch,     CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch,           CURLOPT_POST, true);
curl_setopt($ch,     CURLOPT_POSTFIELDS, $dataStr);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, $f);

// Send the request and echo the response body
$response = curl_exec($ch);
fclose($f);
echo "Reponse is ".$response;
}

Также ниже приведен результат, который я получаю, когда вывожу значения curl в файл.

О подключении() к порту 443 (#0) android.apis.google.com Попытка 74.125.39.139... *connected Подключено к порту 443 (#0) android.apis.google.com (74.125.39.139) успешно установлено расположения проверки сертификата: CAfile: нет CApath: /etc/ssl/certs SSL-соединение с использованием ECDHE-RSA-RC4-SHA Сертификат сервера: тема: C=US; ST=Калифорния; L = вид на горы; О = Google Inc; CN=*.google.com Дата начала: 2011-11-10 07:48:51 GMT Дата истечения срока действия: 2012-11-10 07:58:51 GMT subjectAltName: android.apis.google.com соответствующий эмитент: C=US ; О = Google Inc; CN=Проверка SSL-сертификата Google Internet Authority прошла успешно. ПОСТ/c2dm/отправить HTTP/1.1

Хост: android.apis.google.com

Принять: /

Авторизация: GoogleLogin AUTH = DQAAAMIAAADlJmeJmrTjmzdAbt1HiMvvVj_vdSduVXrkEFk_D19OG0o-> FIn1ZzJ25d3MZfDTK2QErF_jEFAndPgC3RoGif6V-gs9w3-FA7VaEWd62qNPnscsqi1j6R0b0J5vtOwGItNmuXm5n1MZrOZ4sd3yx_D95rtzriymmyhilzLWNAyNjPO6FsmX-4Ty_3OwPaw02qe_oHeSvTNt7s6SW-_kT-T1hdJuywCoSf5p2esSzk9sUj9YDwtEXPneDIaB1z2Qy6NcMBjYY8X185GctBttXrjd

Content-Type: application/x-www-form-urlencoded

Длина контента: 207

HTTP 1.0, предполагается, что он закрыт после тела HTTP/1.0 411 Требуется длина

Тип содержимого: текст/html; кодировка = UTF-8

Длина контента: 11791

Дата: воскресенье, 27 ноября 2011 г., 12:16:06 по Гринвичу

Сервер: GFE/2.0

Закрытие соединения #0

как мне это решить?


person Edem Kofi    schedule 26.11.2011    source источник


Ответы (2)


Кое-что, связанное с этим, находится здесь http://codershelpingcoders.com.Have.

person techie_28    schedule 28.03.2012
comment
Привет, эта страница не работает, и у меня та же ошибка, что и выше, не могли бы вы указать мне решение? - person Federico J.; 25.04.2013
comment
Речь шла о примере кода YouTube. Вы можете найти его здесь github.com/techie28/YouTubeUploadPHP. - person techie_28; 26.04.2013

person    schedule
comment
я попробовал то, что вы написали, но это все еще не работает. То же сообщение об ошибке. - person Edem Kofi; 27.11.2011
comment
Попробуйте слегка подкорректировать код сверху. Проблема, однако, может быть связана с тем, что данные, которые вы отправляете, неверны (например, неиспользуемые переменные $msgType и $messageText или использование пустой переменной $message, что приведет к пустому data.arg. - person DaveRandom; 27.11.2011
comment
я изменил, исправил все ошибки, вместо них используется $messageText, $authCode был удален из параметров функции, но все еще не работает - person Edem Kofi; 27.11.2011
comment
Очень странно - я не вижу очевидной проблемы с вашим текущим кодом. Попробуйте добавить Connection: close в заголовки запроса и посмотрите, решит ли это проблему. - person DaveRandom; 28.11.2011
comment
@EdemKofi Немного почитав и поиграв, я отредактировал свой ответ новым кодом, который, надеюсь, будет работать. Дайте мне знать, как вы справляетесь с этим. - person DaveRandom; 28.11.2011