2012-02-28 4 views
2

J'essaie de faire une demande de publication avec php et curl. Voici mon codephp + curl impossible de définir la méthode de publication

//PHP 5.3.5 and curl: 7.18.2 
$ch = curl_init(); 
if(!empty($save_cookie)){ 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $save_cookie); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $save_cookie); 
}else{ 
    curl_setopt($ch, CURLOPT_COOKIE, $cookie); 
} 

curl_setopt($ch, CURLOPT_REFERER, $referer); 
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); 
curl_setopt($ch, CURLOPT_URL, 'http://localhost/post.php'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $pars); 
curl_setopt($ch, CURLOPT_HEADER, $header); 
curl_setopt($ch, CURLOPT_NOBODY, !$body); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$postResult = curl_exec($ch); 

if (curl_errno($ch)) { 
    return false; 
} 

curl_close($ch); 
return $postResult; 

En http://localhost/post.php, j'écris

print_r($_SERVER); 

Le retour de résultat de boucle est toujours

[REQUEST_METHOD] => GET 
+0

Bizarre. Pouvez-vous poster une trace de paquet? (Utiliser Wireshark ou similaire.) De plus, PHP est-il appelé via CGI ou comme un module? Quel serveur web? Voir aussi http://redmine.lighttpd.net/issues/1472. Je soupçonne que si vous établissiez des données POST et regardiez '$ _POST' dans post.php, vous verriez vos données. – Brad

+0

J'utilise apache + fastcgi. Je suis aussi imprimer $ _POST mais c'est vide – complez

Répondre

2

Supprimez l'option CURLOPT_NOBODY et il fonctionnera. Ou placez-le au-dessus de la ligne CURLOPT_POST.

Je pense que je l'ai déjà rencontré une fois, en essayant d'obtenir seulement l'en-tête d'une réponse. Réglage

curl_setopt($ch, CURLOPT_NOBODY, true); 

effectivement instruit curl d'émettre une demande HEAD, ce qui est une demande POST. Je pense qu'il n'y a aucun moyen de simplement obtenir l'en-tête d'un POST (et il suffit de supprimer la connexion après avoir reçu l'en-tête). Comme un effet secondaire, la mise CURLOPT_NOBODY à false définit le type de requête à GET ...

Avez-vous vraiment besoin le drapeau CURLOPT_NOBODY?

+0

Tu as sauvé ma journée, ça marche maintenant !!! – complez

+0

Mais le problème persiste même avec FALSE en tant que troisième paramètre de 'NOBODY' setopt. Et c'est un bug, car la documentation indique clairement que le type de requête ne doit pas être réinitialisé pour GET de cette façon. – raina77ow

+0

@ raina77ow vous devriez déposer un rapport de bogue! – mvds

2

Essayez de déplacer la droite ligne

curl_setopt($ch, CURLOPT_NOBODY, !$body);

avant la ligne

curl_setopt($ch, CURLOPT_POSTFIELDS, $pars);

.

Il y a un poste intéressant au curl/set_opt page, faire la lumière sur ce comportement:

Si vos données POST semble disparaître (données POST vide, demander est géré par le serveur comme GET) , essayez de réorganiser l'ordre de CURLOPT_POSTFIELDS paramètre avec CURLOPT_NOBODY. CURLOPT_POSTFIELDS a à venir paramètre AFTER CURLOPT_NOBODY parce que si elle vient après annule l'en-tête qui indique à votre cible URL que la demande est un POST pas un GET.

+0

L'en-tête Content-Type ne dit rien sur 'POST' ou' GET'. – mvds

+0

Oui, bien sûr, mais pourquoi répandre les mauvais mots? – mvds

Questions connexes