cURL "Content-length nécessaire d'erreur" ... 3 jours de recherche, pas de chance
Avant de vous demander: j'ai déjà vérifié tous la même question qui avait déjà une réponse, et aucune des solutions proposées de travail. Donc je suis en espérant que quelqu'un peut être en mesure de remarquer une erreur dans mon code.
Lors de la soumission d'une boucle publier sur Google, je suis de retour avec une 411 erreur, "POST demandes nécessitent une-tête Content-length"
//Info required to authenticate
$URL = "https://www.google.com/accounts/ClientLogin";
$POST = http_build_query(array(
'Email' => '[email protected]',
'Passwd' => 'XXXXXXXXXXXXXXX',
'source' => 'primary',
'service' => 'cl'
));
$ch = curl_init( $URL );
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $POST);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch); //returns SID=<sid code>nLSID=<lsid code>nAuth=<auth code> or ERROR=<message>
if ( curl_errno($ch) )
die( 'Error contacting server' );
//Successful auth results in http code 200
if ( curl_getinfo($ch, CURLINFO_HTTP_CODE) != 200 )
die( 'Failed to authenticate' );
//Extract auth code - Authorization: GoogleLogin auth=yourAuthToken
$auth_code = substr($response, strpos($response, 'Auth=')+5);
//We're done here
curl_close($ch);
$url = "https://www.googleapis.com/calendar/v3/calendars/".urlencode('[email protected]')."/events?sendNotifications=true&pp=1&key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx";
$post_data = http_build_query(array(
"end" => array("dateTime" => "2013-14-11T10:40:00.000-07:00"),
"start" => array("dateTime" => "2013-14-11T10:00:00.000-07:00"),
"summary" => "my_summary",
"description" => "my_description"
));
$headers = array(
'Authorization: GoogleLogin auth='.$auth_code.'',
'Content-Type: application/json'
);
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch2, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch2, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch2);
curl_close($ch2);
echo '<pre>'.print_r($output).'</pre>';
Choses que j'ai essayé:
-Ajout d'un " Content-length: '.strlen($post_data)
-Contenu-type de "x-www-form-urlencoded'
-à l'aide d'une manière très simple chaîne json pour post_data de sorte que je n'ai pas utilisé http_build_query
-En essayant de le faire envoyer une mise à la place de la POSTE
-Et quelques autres choses au cours de la dernière quelques jours que je ne peux pas tout à fait droit de rappel maintenant
Intention: Pour ajouter un événement à seulement MON calendrier à l'aide de PHP seulement sans étapes d'authentification requis par l'utilisateur. Ce doit être capable d'exécuter tous à l'intérieur d'une fonction php, de manière asynchrone (via AJAX)
REMARQUE: ne Pas utiliser WordPress ou tout autre CMS
-Kyle
OriginalL'auteur Kyle the Koder | 2013-12-10
Vous devez vous connecter pour publier un commentaire.
Je pense que vous devez définir
CURLOPT_HTTPHEADER
. Vous pouvez essayé avec le passage de données comme une chaîne json.OriginalL'auteur Roopendra
J'ai reçu la même erreur de contenu que vous et a trouvé que j'avais une ligne erronée de pause dans ma tête, causée par une variable, j'ai été compris.
J'ai suivi ce vers le bas à l'aide de
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
qui rendcurl_getinfo()
inclure la demande des en-têtes dans sa sortie.À l'aide de
trim()
sur la variable fixe.OriginalL'auteur nick
Je viens donc de rapidement utilisé un
curl_getinfo
appeler pour voir ce qui a été envoyé (pas tout à fait de votre recommandation, mais il était plus rapide de essayez dans un premier temps)... et bien sûr... il n'y a pas de contenu-la longueur de n'importe où. Je l'ai essayé à la fois avec le Contenu de l'en-tête de longueur annoncé par moi, et de ne PAS être déclaré en moi. Les deux options ont abouti à ce que vous voyez:Il est également intéressant de noter que l'on dit
content_type
= texte/html... même si je l'avais déclaré queapplication/json
:
Voici la sortie de
curl_getinfo
:OriginalL'auteur Kyle the Koder
Mise à jour de réponse...
Dans la deuxième curl appel vous semblez avoir utilisé le mauvais poignée pour une ligne...
est censé être
Réponse originale à cette question...
Vous n'êtes pas le passage d'un en-tête. Avez-vous essayer de passer le contenu de longueur comme en-tête dans ce format?
Votre en-tête est le numéro 1
curl_setopt($ch2, CURLOPT_HTTPHEADER, array( 'Authorization: GoogleLogin auth='.$auth_code, 'Content-Type: application/json', 'Content-length:' . strlen($post_data)) );
(Code de formatage n'est pas coopératif pour moi.)Aussi, gardez à l'esprit que j'ai deux cURL appels dans le code. La première est d'obtenir un jeton d'authentification, et le second (en utilisant le jeton), est celui que j'ai utilisé les en-têtes depuis qu'il est en fait de l'envoi de contenu) Aussi, juste pour le fun, j'ai juste essayé d'ajouter le contenu de l'en-tête de longueur pour le premier appel de l'authentification cURL appel, et ce n'est pas faire quelque chose de différent 🙁
Wow, je viens de le trouver. Votre deuxième curl si vous appelez d'une ligne à l'aide de l' $ch poignée à la place de $ch2 donc il n'est pas configuré comme un poste. Mise à jour de réponse.
Oh bonne prise! Je ne peux pas croire que je ne savais pas que! Malheureusement, il n'a pas de résoudre le problème 🙁 ce que cela Pourrait être un problème de configuration du serveur? Je ne suis pas familier avec l'impact de la configuration du serveur joue sur curl appels, mais peut-être?
J'en doute fortement, mais vous pouvez tirer à cet appel à votre propre script php et le script php var_dump les en-têtes et les valeurs post et ensuite CURL sortie de la réponse de voir que tout va bien envoyé comme prévu.
OriginalL'auteur Lenny
J'ai eu du mal pendant un certain temps avec un problème similaire. Dans mon cas, c'était parce que l'une des valeurs de I a été mise dans mes en-têtes terminée par un caractère de saut de ligne. Cela signifie que le serveur de réception de la poste devraient voir le double-saut de ligne et prématurément pense que les en-têtes ont été fini (qui a arrêté le Contenu de l'en-tête de Longueur de cours de lecture). La Solution a été de couper le saut de ligne char.
OriginalL'auteur Daniel Howard