56

我正在尝试将 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 请求?

因为这个整个代码与 POST 完美配合,现在我正在尝试将其更改为 GET,如您所见

4

5 回答 5

54

接受的答案是错误的。GETrequests 确实可以包含一个正文。这是WordPress 实现的解决方案,例如:

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

编辑:为了澄清,curl_setopt在这种情况下初始是必要的,因为 libcurl 将POST在使用时默认 HTTP 方法CURLOPT_POSTFIELDS(请参阅文档)。

于 2015-07-23T05:48:48.200 回答
36

CURLOPT_POSTFIELDS顾名思义,用于POST请求的主体(有效负载)。对于GET请求,有效负载是查询字符串形式的 URL 的一部分。

在您的情况下,您需要使用需要发送的参数(如果有)构造 URL,并删除 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);
于 2013-06-21T07:56:44.487 回答
6
  <?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>";
  }

  ?>
于 2016-11-21T08:13:44.227 回答
0

对于那些遇到类似问题的人,这个请求库允许您在 php 应用程序中无缝地发出外部 http 请求。简化的 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中找到

于 2018-10-03T11:11:56.917 回答
-1

您已经以正确的方式使用

curl_setopt($ch, CURLOPT_POSTFIELDS,$body);

但我注意到你不见了

curl_setopt($ch, CURLOPT_POST,1);
于 2013-06-21T07:56:33.327 回答