Jak przejść z POST do GET w PHP CURL


83

Próbowałem przełączyć się z poprzedniego żądania posta na żądanie Get. Który zakłada, że ​​jest to Get, ale ostatecznie robi post.

Wypróbowałem następujące w PHP:

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

czego mi brakuje?

Dodatkowe informacje: mam już połączenie skonfigurowane do wykonywania żądania POST. To kończy się pomyślnie, ale później, gdy próbuję ponownie użyć połączenia i przełączam się z powrotem do GET za pomocą setopts powyżej, nadal kończy się wewnętrznie wykonaniem POST z niekompletnymi nagłówkami POST. Problem polega na tym, że uważa, że ​​wykonuje GET, ale kończy się umieszczeniem nagłówka POST bez parametru content-length i połączenie kończy się niepowodzeniem z 411 ERROR.


3
Zachowaj ostrożność, korzystając z funkcji Pobierz żądania. Google się z nimi bawi. ;)
NotMe

10
@Chris - znajomy odkrył to na własnej skórze, gdy zbudował witrynę, która zarządzała treściami dodanymi przez użytkowników za pośrednictwem żądań GET. Googlebot z radością podążał za wszystkimi linkami „usuń” z przewidywalnymi wynikami.
Meredith L. Patterson

Odpowiedzi:


109

Upewnij się, że umieszczasz ciąg zapytania na końcu adresu URL podczas wykonywania żądania GET.

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

// Ustaw tutaj dane zapytania z adresem 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;
Z POST przekazujesz dane za pomocą opcji CURLOPT_POSTFIELDS 
przekazania go w CURLOPT__URL.
-------------------------------------------------- -----------------------

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

// Ustaw metodę żądania na POST
curl_setopt ($ ch, CURLOPT_POST, 1);

// Ustaw tutaj dane zapytania z CURLOPT_POSTFIELDS
curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ qry_str);

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

Uwaga z curl_setopt()dokumentacji dla CURLOPT_HTTPGET(wyróżnienie dodane):

[Ustaw CURLOPT_HTTPGET jako równe], TRUEaby zresetować metodę żądania HTTP do GET.
Ponieważ GET jest wartością domyślną, jest to konieczne tylko wtedy, gdy metoda żądania została zmieniona.


3
To dość zły sposób na ustawienie limitu czasu na 51 sekund!
Jack Goossen

Niezły chwyt @JackGoossen!
RC.

55

Dodaj to przed wywołaniem curl_exec ($ curl_handle)

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

39

Rozwiązany: problem leży tutaj:

Ustawiłem POSTprzez oba _CUSTOMREQUESTi _POSTi _CUSTOMREQUESTtrwały jak POSTpodczas _POSTprzełączania na _HTTPGET. Serwer przyjął nagłówek od _CUSTOMREQUESTjako właściwy i wrócił z 411.

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.