C2DM 411. Это ошибка.POST-запросы требуют заголовка Content-length - PullRequest
0 голосов
/ 26 ноября 2011

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

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 в файл

О подключении () к порту android.apis.google.com 443 (# 0) Попытка 74.125.39.139 ... * подключена Подключен к android.apis.google.com (74.125.39.139) порт 443 (# 0) успешно установлен сертификат, проверьте места: CAfile: нет CApath: / etc / ssl / certs SSL-соединение с использованием ECDHE-RSA-RC4-SHA Сертификат сервера: тема: C = США; ST = Калифорния; L = Маунтин-Вью; O = 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; O = Google Inc; CN = Google Internet Authority SSL-сертификат подтвердите. POST / c2dm / send HTTP / 1.1

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

Примите: /

Разрешение: GoogleLogin AUTH = DQAAAMIAAADlJmeJmrTjmzdAbt1HiMvvVj_vdSduVXrkEFk_D19OG0o-> FIn1ZzJ25d3MZfDTK2QErF_jEFAndPgC3RoGif6V-gs9w3-FA7VaEWd62qNPnscsqi1j6R0b0J5vtOwGItNmuXm5n1MZrOZ4sd3yx_D95rtzriymmyhilzLWNAyNjPO6FsmX-4Ty_3OwPaw02qe_oHeSvTNt7s6SW-_kT-T1hdJuywCoSf5p2esSzk9sUj9YDwtEXPneDIaB1z2Qy6NcMBjYY8X185GctBttXrjd

Тип содержимого: application / x-www-form-urlencoded

Длина содержимого: 207

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

Content-Type: text / html; кодировка = UTF-8

Длина содержимого: 11791

Дата: вс, 27 ноября 2011 12:16:06 GMT

Сервер: GFE / 2.0

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

как мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 26 ноября 2011
function send ($deviceRegistrationId, $msgType, $messageText) {

  $reg_id = $deviceRegistrationId; // Registration ID
  $device_id = "1"; 

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

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

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

  // For debugging
  //$f = fopen('request.txt', 'w');
  //curl_setopt($ch,        CURLOPT_VERBOSE, true);
  //curl_setopt($ch,         CURLOPT_HEADER, 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;

}
0 голосов
/ 28 марта 2012

Что-то связанное с этим здесь http://codershelpingcoders.com.Have взгляд

...