我尝试使用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) ""
}
据我所知,我正在正确设置标题(常量拼写正确,我没有多次设置它们)。我做错了什么?
答案 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");
证书在哪里?
点击地址栏左侧的锁垫
然后点击更多信息
现在点击view certificate
按钮
在打开的弹出窗口中,您会在该点击详细信息标签中看到两个标签(快捷方式ALT + D
)。
然后单击导出按钮并保存证书
这是你必须给出的路径
curl_setopt($ ch,CURLOPT_CAINFO,getcwd()。“/ CAcerts / your_certificate.crt”)