PHP cURL GET请求和请求的正文

its*_*sme 28 php curl http-get

我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

当你看到我想传递$ body作为请求的正文,但我不知道它是否正确而我实际上无法调试,你知道是否有权使用 curl_setopt($ch, CURLOPT_POSTFIELDS,$body);GET请求吗?

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

Dan*_*Dan 27

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

curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'GET' );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $body );
Run Code Online (Sandbox Code Playgroud)

编辑:为了澄清,curl_setopt在这种情况下,初始是没有必要的,但没有伤害.包含它是为了充分说明所引用的示例代码.

  • 没有必要对`CURLOPT_CUSTOMREQUEST`使用`GET`,因为在PHP中使用`libcurl`实现意味着每个请求都是`GET`或`HEAD`类型.所以基本上没有官方支持`GET`和Wordpress代码正在做它最擅长的 - 创建冗余. (4认同)
  • 通过使用 Wireshark 检查实际请求数据,我可以看到设置“CURLOPT_POSTFIELDS”时使用的 HTTP 方法实际上是“POST”。这与 libcurl 的[记录的行为](https://curl.haxx.se/libcurl/c/CURLOPT_POSTFIELDS.html)相匹配;“使用 CURLOPT_POSTFIELDS 意味着将 CURLOPT_POST 设置为 1”。因此,带有正文的“GET”请求需要设置“CURLOPT_CUSTOMREQUEST”。 (3认同)
  • 明确指出类型有什么害处呢?通过这样做,他们可以避免需要额外的 case 语句。它涵盖了“GET”、“DELETE”、“PATCH”等。恕我直言,代码更简洁。 (2认同)

Bur*_*lid 24

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);
Run Code Online (Sandbox Code Playgroud)

  • @BurhanKhalid你所说的并不完全正确.[GET方法](http://tools.ietf.org/html/rfc2616#page-53)不会禁止GET请求的主体,无论如何我对php的cURL绑定一无所知.Badbetonbreakbutbedbackbone:搜索你的问题我发现这个项目试试[它](https://github.com/guzzle/guzzle). (3认同)
  • 这不是正确答案。它甚至没有回答最初的问题。可以在 URI 之外的请求正文中使用 GET 方法发送请求有效负载。@Dario,不幸的是,Guzzle 不支持它,因为它不在规范中。 (2认同)

小智 5

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

  ?>
Run Code Online (Sandbox Code Playgroud)

  • @FernandoTorres 因为仅输入 `[]` 比输入 `array()` 短得多 (3认同)