PHP cURL получить запрос и тело запроса

Я пытаюсь использовать cURL для запроса GET следующим образом:

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

Как вы видите, я хочу передать $body как тело запроса, но я не знаю, правильно ли это или нет, и я не могу отладить это на самом деле, знаете ли вы, имеет ли право использовать curl_setopt($ch, CURLOPT_POSTFIELDS,$body); с запросом GET?

потому что этот код enteire отлично работает с POST, теперь я пытаюсь изменить это, чтобы получить, как вы можете видеть

5 ответов


CURLOPT_POSTFIELDS как следует из названия, для тела (полезной нагрузки)POST запрос. Для GET запросы, груз является частью URL-адреса в виде строки запроса.

в вашем случае вам нужно создать URL-адрес с аргументами, которые вам нужно отправить (если таковые имеются), и удалить другие параметры для скручивания.

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

принятый ответ неверен. GET запросы действительно могут содержать тела. Это решение реализовано WordPress, например:

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

EDIT: чтобы уточнить, начальный curl_setopt не является необходимым в этом случае, но не наносит вреда. Он был включен, чтобы полностью проиллюстрировать пример кода, на который ссылаются.


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

  ?>

для тех, кто приходит к этому с аналогичными проблемами,эта библиотека запросов позволяет сделать внешние http-запросы кажущимися в вашем php-приложении. Упрощенные запросы GET, POST, PATCH, DELETE и PUT.

запрос образца был бы как ниже

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

документация для этого же можно найти в проекте README.md


вы сделали это правильно, используя

curl_setopt($ch, CURLOPT_POSTFIELDS,$body);

но я заметил, что недостающие

curl_setopt($ch, CURLOPT_POST,1);