web-dev-qa-db-fra.com

PHP CURL GET request et corps de la requête

j'essaie d'utiliser cURL pour une requête GET comme celle-ci:

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;
}

Comme vous le voyez, je veux passer $ body en tant que corps de la requête, mais je ne sais pas s'il est correct ou non et je ne peux pas le déboguer, savez-vous si le droit d'utiliser curl_setopt($ch, CURLOPT_POSTFIELDS,$body); avec une requête GET est?

Parce que ce code enteire fonctionne parfaitement avec POST, maintenant je suis en train de changer cela pour GET comme vous pouvez le voir

19
itsme

CURLOPT_POSTFIELDS, comme son nom l'indique, est destiné au corps (charge utile) d'une requête POST. Pour les demandes GET, la charge fait partie de l'URL sous la forme d'une chaîne de requête.

Dans votre cas, vous devez construire l'URL avec les arguments que vous devez envoyer (le cas échéant) et supprimer les autres options de 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);
25
Burhan Khalid

La réponse acceptée est fausse. Les requêtes GET peuvent en effet contenir un corps. Voici la solution implémentée par WordPress , à titre d'exemple:

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

EDIT: Pour clarifier, le curl_setopt initial n'est pas nécessaire dans ce cas, mais ne nuit pas. Il a été inclus pour illustrer pleinement l'exemple de code référencé.

19
Dan
  <?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);
  $new=   $result->status;
  if( $new =="1")
  {
    echo "<script>alert('Student list')</script>";
  }
  else 
  {
    echo "<script>alert('Not Removed')</script>";
  }

  ?>
4
Siddharth Shukla

Pour ceux qui rencontrent des problèmes similaires, cette bibliothèque de requêtes vous permet de faire des requêtes http externes sans le moindre problème au sein de votre application php. Requêtes simplifiées GET, POST, PATCH, DELETE et PUT.

Un exemple de demande serait comme ci-dessous 

use Libraries\Request;

$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

La documentation correspondante est disponible dans le projet README.md

0
Danny Sofftie