Cererea PHP cURL GET și corpul cererii (Programare, Php, Curl, Http Get)

itsme a intrebat.

încerc să folosesc cURL pentru o cerere GET, astfel:

function connect($id_user){
    $ch = curl_init();
    $headers = array(
    'Accept: application/json',
    'Content-Type: application/json',

    );
    curl_setopt($ch, CURLOPT_URL, $this->service_url.'user/'.$id_user);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    $body = '{}';

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
    curl_setopt($ch, CURLOPT_POSTFIELDS,$body);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    // Timeout in seconds
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);

    $authToken = curl_exec($ch);

    return $authToken;
}

După cum vedeți, vreau să trec $body ca și corp al cererii, dar nu știu dacă este corect sau nu și nu pot să depanez acest lucru, știți dacă este corect să folosesc curl_setopt($ch, CURLOPT_POSTFIELDS,$body); cu o cerere GET?

Pentru că acest cod enteire funcționează perfect cu POST, dar acum încerc să schimb acest lucru cu GET, după cum puteți vedea.

Comentarii

5 răspunsuri
Burhan Khalid

CURLOPT_POSTFIELDS după cum sugerează și numele, este pentru corpul (sarcina utilă) unui POST cerere. Pentru GET cereri, sarcina utilă face parte din URL sub forma unui șir de interogare.

În cazul dumneavoastră, trebuie să construiți URL-ul cu argumentele pe care trebuie să le trimiteți (dacă există) și să eliminați celelalte opțiuni pentru cURL.

curl_setopt($ch, CURLOPT_URL, $this->service_url.'user/'.$id_user);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, 0);

//$body = '{}';
//curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
//curl_setopt($ch, CURLOPT_POSTFIELDS,$body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

Comentarii

  • @BurhanKhalid ceea ce ai spus nu este în întregime adevărat. Metoda GET nu nepermite body pentru cereri GET, oricum nu știu nimic despre legăturile cURL pentru php. Badbetonbreakbutbedbackbone: căutând pentru problema ta am găsit acest proiect încearcă it. –  > Por Dario.
  • Nu am spus că nu este permisă, am spus că este modul în care GET funcționează. Poți trece orice număr de lucruri în corpul cererii, însă celălalt server nu le va lua în considerare. payload unei cereri (datele pe care intenționați să le trimiteți) este ceea ce contează; și pentru GET, se află în șirul de interogare. –  > Por Burhan Khalid.
  • Cum puteți ști cum gestionează serverul cererea în funcție de apelul real al clientului? Din moment ce întrebarea implică faptul că badbetonbreakbutbedbackbone trebuie să ancheteze un server care gestionează corpul unei cereri GET cred că ceea ce ați scris nu este deloc corect, nu este adevărat că un server anchetat a priori aruncă informația. Sunt doar 2 cenți ai mei. –  > Por Dario.
  • Deci, ceea ce înțeleg eu din întrebare este cum poate un client php să trimită un corp într-o cerere GET (el știe doar despre această opțiune că face un lucru similar în PUT și POST). Înainte de a scrie primul meu comentariu am verificat dacă, prin cURL (comandă bash) și prin httpie (httpie.org), există posibilitatea de a trimite un corp în cererile GET. Așa că atunci când mi-am dat seama că se trimite body în cererile GET am verificat RFC-ul pentru a fi sigur de acest lucru. Pentru a mă asigura din nou am scris un simplu server express.js cu o rută GET care conține jurnalele de cerere:din nou când am întrebat prin httpie am văzut ce am trecut în corp. 🙂 –  > Por Dario.
  • Acesta nu este răspunsul corect. Nici măcar nu răspunde la întrebarea inițială. Este posibil să trimiteți un Request Payload cu o metodă GET în afara URI-ului, în corpul cererii. @Dario, din nefericire, Guzzle nu acceptă acest lucru, deoarece nu se regăsește în specificație. –  > Por Pedro Cordeiro.
Dan

Răspunsul acceptat este greșit. GET Cererile pot conține într-adevăr un corp. Aceasta este soluția implementată de WordPress, , ca exemplu:

curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'GET' );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $body );

EDIT: Pentru a clarifica, răspunsul inițial curl_setopt este necesară în acest caz, deoarece libcurl va seta implicit metoda HTTP la POST atunci când se utilizează CURLOPT_POSTFIELDS (a se vedea documentația).

Comentarii

  • Nu este necesar să se utilizeze GET pentru CURLOPT_CUSTOMREQUEST deoarece cu libcurl din PHP, se presupune că fiecare cerere este de tip GET sau HEAD. Deci, practic, nu există un suport oficial pentru GET iar codul WordPress face ceea ce știe să facă cel mai bine – creează redundanță. –  > Por brezanac.
  • Ce rău face totuși indicarea explicită a tipului? Făcând-o în acest fel, ei evită să aibă nevoie de declarații de caz suplimentare. Aceasta acoperă GET, , DELETE, , PATCH, , etc. Un cod mult mai curat, în opinia mea. –  > Por Dan.
  • Cu toate acestea request stabilește în continuare valori implicite care includ GET ca metodă de solicitare implicită. WordPress nu este un exemplu foarte bun de cod bine scris. –  > Por brezanac.
  • Te-ai uitat de fapt la codul citat…? GET în exemplul de mai sus este de fapt o variabilă. Se pare că ești un webdev care e supărat că WP face ca oricine să poată scrie un site, lăsându-te fără slujbă 😉 –  > Por Dan.
  • $r['method'] (linia 1424) este extrasă din request argumentele funcției (linia 1361), care este gestionată de funcția wb_parse_args care, pe de altă parte, folosește valorile implicite (linia 1354) în cazul în care nicio opțiune de cerere nu este suprascrisă cu funcția request argumentele funcției. Totul se află în cod, trebuie doar să știți cum să-l citiți. Iar eu nu mă ocup de softuri precum WordPress. –  > Por brezanac.
Siddharth Shukla
  <?php
  $post = ['batch_id'=> "2"];
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL,'https://example.com/student_list.php');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
  $response = curl_exec($ch);
  $result = json_decode($response);
  curl_close($ch); // Close the connection
  $new=   $result->status;
  if( $new =="1")
  {
    echo "<script>alert('Student list')</script>";
  }
  else 
  {
    echo "<script>alert('Not Removed')</script>";
  }

  ?>

Comentarii

  • De ce oamenii insistă să folosească modul [] pentru a folosi array-uri? Este atât de urât. –  > Por Fernando Torres.
  • @FernandoTorres pentru că tastarea doar [] este mult mai scurtă decât tastarea array() –  > Por 1234ru.
  • @Siddharth Întrebarea este despre corpul cererii GET, nu POST –  > Por JayminLimbachiya.
Danny Sofftie

Pentru cei care vin la acest lucru cu probleme similare, această bibliotecă de cereri vă permite să faceți cereri externe http fără probleme în cadrul aplicației php. Cereri GET, POST, PATCH, DELETE și PUT simplificate.

Un exemplu de cerere ar fi ca mai jos

use LibrariesRequest;

$data = [
  'samplekey' => 'value',
  'otherkey' => 'othervalue'
];

$headers = [
  'Content-Type' => 'application/json',
  'Content-Length' => sizeof($data)
];

$response = Request::post('https://example.com', $data, $headers);
// the $response variable contains response from the request

Documentația pentru aceasta poate fi găsită în pagina web a proiectului README.md

DevZer0

ați făcut-o în mod corect, folosind

curl_setopt($ch, CURLOPT_POSTFIELDS,$body);

dar am observat că vă lipsește

curl_setopt($ch, CURLOPT_POST,1);

Comentarii

  • așa că de ce ar trebui să folosesc asta? –  > Por itsme.
  • pentru că folosești un câmp POST, deci trebuie să faci o cerere de postare –  > Por DevZer0.
  • Faceți ceea ce a spus @Khalid mai jos –  > Por DevZer0.
  • Acesta nu este, de asemenea, răspunsul la această întrebare. REST specifică faptul că trebuie să utilizați o cerere GET pentru a prelua informații și este posibil să doriți să trimiteți câteva filtre în Request Payload. Trecerea metodei la POST încalcă specificația originală a întrebării. Trimiterea unui payload în cadrul unei metode GET ESTE posibilă, dar nu sunt sigur cu libcurl. –  > Por Pedro Cordeiro.