【问题标题】:PHP cURL - How do I send the body of the request?PHP cURL - 如何发送请求正文?
【发布时间】:2020-10-10 05:06:50
【问题描述】:

我在尝试使用 PHP 向 API 发布请求时遇到问题。我无法控制 API 服务器,必须以他们请求的格式发送数据。他们唯一真正的文档是 CLI 的以下示例:

curl -X POST 'http://username:password@domain.tld/foo/bar?param1=false&param2=0' -d 'Hello World!'

尝试将其放入 PHP 中,我认为我已经复制了大部分内容,代码如下:

$ch = curl_init();
$username="username";
$password="password";
$data="Hello World!";
$url = "http://" . $username . ":" . $password . "@domain.tld";
$postvars = array( "param1"=>"false", "param2"=>0 );
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
$response = curl_exec($ch);
curl_close ($ch);

但我无法确定数据部分的去向?如何发送请求正文(-d 之后的部分?

我在 PHP cURL 文档中看不到任何指示应如何形成请求正文的内容。

【问题讨论】:

    标签: php curl


    【解决方案1】:

    您需要使用CURLOPT_POSTFIELDS 选项发布正文数据并将参数附加到url,而不是设置为发布字段。

    因此,您的代码将是:

    $ch = curl_init();
    $username = "username";
    $password = "password";
    $data = "Hello World!";
    
    $url = "http://" . $username . ":" . $password . "@domain.tld";
    $params = array( "param1"=>"false", "param2"=>0 );
    
    $url .= "?" . http_build_query($params);
    
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
    $response = curl_exec($ch);
    curl_close($ch);
    

    【讨论】:

    • 我可以设置两次吗?一次是参数,然后是身体?
    • @yknivag 我修改了答案。您需要将参数附加到 url 而不是帖子正文。
    【解决方案2】:

    关于 POST 字段,您需要 CURLOPT_POSTFIELDS 选项。

    例子:

    CURLOPT_POSTFIELDS => array('var1' => 1,'var2' => 2)
    

    关于用户名和密码,我建议你使用 CURLOPT_USERPWD。​​p>

    例子:

    CURLOPT_USERPWD => "$username:$password"
    

    【讨论】:

      【解决方案3】:

      使用CURLOPT_POSTFIELDS 喜欢:

      $ch = curl_init();
      
      curl_setopt($ch, CURLOPT_URL, 'http://username:password@domain.tld/foo/bar?param1=false&param2=0');
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, "Hello World!");
      curl_setopt($ch, CURLOPT_POST, 1);
      
      $headers = array();
      $headers[] = 'Content-Type: application/x-www-form-urlencoded';
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
      
      $result = curl_exec($ch);
      if (curl_errno($ch)) {
          echo 'Error:' . curl_error($ch);
      }
      curl_close ($ch);
      

      【讨论】:

        猜你喜欢
        • 2018-03-30
        • 2017-04-23
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        • 2014-11-06
        • 2012-10-13
        • 2013-12-09
        • 1970-01-01
        相关资源
        最近更新 更多