2009-08-04 16 views
63

J'ai essayé de passer d'une demande Post précédente à une requête Get. Ce qui suppose que c'est un Get mais finalement fait un post.Comment passer de POST à ​​GET en PHP CURL

J'ai essayé les éléments suivants en PHP:

curl_setopt($curl_handle, CURLOPT_POSTFIELDS, null); 
curl_setopt($curl_handle, CURLOPT_POST, FALSE); 
curl_setopt($curl_handle, CURLOPT_HTTPGET, TRUE); 

Qu'est-ce que je manque?

Informations supplémentaires: J'ai déjà une connexion configurée pour faire une demande POST. Cela se termine avec succès, mais plus tard lorsque j'essaie de réutiliser la connexion et de revenir à GET en utilisant le setopts ci-dessus, il finit par faire un POST en interne avec des en-têtes POST incomplètes. Le problème est qu'il croit faire un GET mais finit par mettre un en-tête POST sans le paramètre content-length et la connexion échoue avec un 411 ERROR.

+3

Soyez prudent avec les demandes Get. Google s'amuse avec eux. ;) – NotMe

+8

@Chris - un ami a découvert que, à la dure, il construisait un site qui gérait le contenu fourni par l'utilisateur via des requêtes GET. Googlebot a suivi avec bonheur tous les liens «supprimer», avec des résultats prévisibles. –

Répondre

28

Résolu: Le problème est ici:

Je mis POST via à la fois _CUSTOMREQUEST et _POST et le _CUSTOMREQUEST persistait que POST tout _POST commuté à _HTTPGET. Le serveur a pris l'en-tête de _CUSTOMREQUEST être la bonne et est revenu avec un 411.

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'POST'); 
86

Assurez-vous de placer votre chaîne de requête à la fin de votre URL lorsque vous effectuez une requête GET.

 
$qry_str = "?x=10&y=20"; 
$ch = curl_init(); 

// Set query data here with the URL 
curl_setopt($ch, CURLOPT_URL, 'http://example.com/test.php' . $qry_str); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 3); 
$content = trim(curl_exec($ch)); 
curl_close($ch); 
print $content; 
 
With a POST you pass the data via the CURLOPT_POSTFIELDS option instead 
of passing it in the CURLOPT__URL. 
------------------------------------------------------------------------- 

$qry_str = "x=10&y=20"; 
curl_setopt($ch, CURLOPT_URL, 'http://example.com/test.php'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 3); 

// Set request method to POST 
curl_setopt($ch, CURLOPT_POST, 1); 

// Set query data here with CURLOPT_POSTFIELDS 
curl_setopt($ch, CURLOPT_POSTFIELDS, $qry_str); 

$content = trim(curl_exec($ch)); 
curl_close($ch); 
print $content; 

Note du curl_setopt() docs pour CURLOPT_HTTPGET (italique ajouté):

[Set CURLOPT_HTTPGET égal à] TRUE-réinitialiser la méthode de requête HTTP GET.
Comme GET est la valeur par défaut, cela n'est nécessaire que si la méthode de requête a été modifiée.

+0

C'est une très mauvaise façon de définir un délai d'attente de 51 secondes! –

+0

Belle prise @JackGoossen! –

39

Ajouter cette avant d'appeler curl_exec (curl_handle de $)

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'GET'); 
2

demande CURL par défaut est GET, vous Vous n'avez pas à définir d'options pour faire une requête GET CURL.

+0

Pas par ici ... curl essaie de poster automatiquement. –