内容类型未在PHP中的cURL中设置

时间:2014-11-04 11:14:57

标签: php http curl header content-type

我尝试使用cURL向API发送请求(Xero,具体而言),但我显然是在发送空请求。我检查了cURL信息,看起来我没有内容类型设置,即使我已经在代码中设置了它。

这是我的代码:

    $content = $this->getContent();
    $headers = [
        "Content-Type: application/x-www-form-urlencoded",
        "Content-Length: " . strlen($content),
        "Connection: close"
    ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $this->getUrl());
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_HEADER, true);

    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $content);

    de($headers, curl_getinfo($ch));

de()是"转储和退出"功能,它输出:

 array(3) {
  [0] =>
      string(47) "Content-Type: application/x-www-form-urlencoded"
  [1] =>
      string(20) "Content-Length: 1003"
  [2] =>
      string(17) "Connection: close"
}

array(26) {
  'url' =>
  string(41) "https://api.xero.com/api.xro/2.0/Invoices"
  'content_type' =>
  NULL
  'http_code' =>
  int(0)
  'header_size' =>
  int(0)
  'request_size' =>
  int(0)
  'filetime' =>
  int(0)
  'ssl_verify_result' =>
  int(0)
  'redirect_count' =>
  int(0)
  'total_time' =>
  double(0)
  'namelookup_time' =>
  double(0)
  'connect_time' =>
  double(0)
  'pretransfer_time' =>
  double(0)
  'size_upload' =>
  double(0)
  'size_download' =>
  double(0)
  'speed_download' =>
  double(0)
  'speed_upload' =>
  double(0)
  'download_content_length' =>
  double(-1)
  'upload_content_length' =>
  double(-1)
  'starttransfer_time' =>
  double(0)
  'redirect_time' =>
  double(0)
  'certinfo' =>
  array(0) {
    }
  'primary_ip' =>
  string(0) ""
  'primary_port' =>
  int(0)
  'local_ip' =>
  string(0) ""
  'local_port' =>
  int(0)
  'redirect_url' =>
  string(0) ""
}

据我所知,我正在正确设置标题(常量拼写正确,我没有多次设置它们)。我做错了什么?

1 个答案:

答案 0 :(得分:2)

首先使用curl_error函数click me for detail!!

进行检查

因为您的网址为https。所以遵循ssl验证过程。

非正式修复:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

正式修复:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/CAcerts/your_certificate.crt");

证书在哪里?

  1. 在firefox浏览器中浏览网址
  2. Go to the site

    1. 点击地址栏左侧的锁垫

    2. 然后点击更多信息 more info

    3. 现在点击view certificate按钮 certificate

    4. 在打开的弹出窗口中,您会在该点击详细信息标签中看到两个标签(快捷方式ALT + D)。

    5. 然后单击导出按钮并保存证书

    6. export

      1. 这是你必须给出的路径

        curl_setopt($ ch,CURLOPT_CAINFO,getcwd()。“/ CAcerts / your_certificate.crt”)