curl CLI 与 php curl
curl CLI versus php curl
我已经使用 php Curl 一段时间了,我最近偶然发现了一段 curl CLI,我无法在 PHP curl 中工作。
CLI curl 如下所示:
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"
}
]
这是我在代码中提供的所有正确数据。
尽管如此,我尝试推送文件和元数据的服务器也响应错误,即未提供或未上传选项数组或文件名。仅当我尝试通过 PHP 推送它时才会出现此错误,当我 运行 在 Linux 服务器上运行原始 curl 命令时它工作正常。
关于双 -F 选项,我是否有误?还是我错过了 posting 的新 CURLFile 方法中的某些内容,因为在 Stack Overlow 上所有以前的 post 中都使用了使用“@”的已弃用方法?
curl cli 命令的header 部分和php curl 在调试时似乎是相同的。由于 ssl 加密(https,无法在接收服务器上关闭),负载本身无法轻松验证。
提前致谢。
G.
此问题已解决。 CURL 完美运行,但供应商 API 集成未按预期运行。
它要求 JSON 选项变量,但没有记录的是 ORDER 很重要,如果您要求 JSON.
,这是完全不能接受的
供应商已获悉并将修补此问题,因为在进行详细调查时发现解析 JSON 的方法可能会产生一些安全后果。
我已经使用 php Curl 一段时间了,我最近偶然发现了一段 curl CLI,我无法在 PHP curl 中工作。
CLI curl 如下所示:
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"
}
]
这是我在代码中提供的所有正确数据。
尽管如此,我尝试推送文件和元数据的服务器也响应错误,即未提供或未上传选项数组或文件名。仅当我尝试通过 PHP 推送它时才会出现此错误,当我 运行 在 Linux 服务器上运行原始 curl 命令时它工作正常。
关于双 -F 选项,我是否有误?还是我错过了 posting 的新 CURLFile 方法中的某些内容,因为在 Stack Overlow 上所有以前的 post 中都使用了使用“@”的已弃用方法?
curl cli 命令的header 部分和php curl 在调试时似乎是相同的。由于 ssl 加密(https,无法在接收服务器上关闭),负载本身无法轻松验证。
提前致谢。
G.
此问题已解决。 CURL 完美运行,但供应商 API 集成未按预期运行。
它要求 JSON 选项变量,但没有记录的是 ORDER 很重要,如果您要求 JSON.
,这是完全不能接受的供应商已获悉并将修补此问题,因为在进行详细调查时发现解析 JSON 的方法可能会产生一些安全后果。