curl CLI versus php curl


curl CLI versus php curl

我使用php Curl已经有一段时间了,最近我偶然发现了一个Curl CLI,我无法在php Curl中使用它。

CLI卷曲如下所示:

curl -qgsSkH "Content-Type: multipart/form-data"
--no-progress-bar
--header "X-Api-Token: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
-F "filename=@c/tmp/test.txt"
-F "options={'"application'":'"2'",'"timeout'":'"500'",'"priority'":'"0'"}"
https://xxxaddrxxx:443/API/vers1.0/sub

我使用以下PHP curl代码来模拟上面的CLI curl:

$file = new CURLFile($fileEntry->getStoragePath());
$file->setMimeType($fileEntry->mime);
$file->setPostFilename($fileEntry->original_filename);
$data = array();
$data['options'] = json_encode($postData);
$data['filename'] = $file;
$headers = array();
$headers[] = "Content-Type: multipart/form-data";
$headers[] = 'X-FeApi-Token: '.$this->authToken;
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, TRUE);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLINFO_HEADER_OUT, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
$curl_response = curl_exec($curl);

当我输出$data数组时,它将给出以下内容:

array:2 [
  "options" => "{"application":"2","priority":"0","timeout":"5000"}"
  "filename" => CURLFile {
    +name: "/etc/tmp/5645db226dbddINVOICE-722.doc"
    +mime: "application/msword"
    +postname: "INVOICE-722.doc"
  }
]

这是与我在代码中提供的内容相对应的所有正确数据。

更不用说,我试图推送文件和元数据的服务器也会响应一个错误,即选项数组或文件名没有被输入或上传。当我在Linux服务器上运行原始curl命令时,只有当我试图通过PHP推动它时,才会出现这个错误——它运行得很好。

我在双F选项上犯了错误吗?或者,我在新的CURLFile发布方法中遗漏了什么,因为在Stack Overlow上的所有以前的帖子中都使用了不推荐使用的使用"@"的方法?

curl-cli命令和php-ccurl的头部在调试时似乎是相同的。由于ssl加密(https,在接收服务器上无法关闭),负载本身无法轻松验证。

提前谢谢。

G。

此问题已修复。CURL运行得很好,因为供应商API集成没有按预期运行。

它要求一个JSON选项变量,但没有记录的是ORDER很重要,如果您请求一个JSON,这是完全不可接受的。

供应商会得到通知,并将修补此问题,因为在进行详细调查时,发现解析JSON的方法可能会产生一些安全后果。