http - PHP CURL请求后端API时(POST), 怎么构造请求数据使请求body里有多个boundary
请求方法: post
请求body:
//part1,content-type:application/json
{
"description": "desdes"
}
//part2,content-type: octet-stream
{
"product_img": octet-stream file,
"config_img ": octet-stream file,
"dopm": octet-stream file
}
从API要求的数据看,php curl
发送post数据时, 构造的post请求体要有两个content-type
一个为普通的数据Content-Type: application/json
一个要求为content-type: octet-stream
, 二进制流, 主要是图片及其他格式文件转换成流的形式, 传输到API进行保存
平时都是使用curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
来设置请求body, 那么现在这样的格式要怎么构造请求体
$header = NULL;
$body = [];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
if(!is_null($header)){
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$curl_get = curl_exec($curl);
回复内容:
请求后端API时, 后端接收的数据格式如下所示:
请求方法: post
请求body:
//part1,content-type:application/json
{
"description": "desdes"
}
//part2,content-type: octet-stream
{
"product_img": octet-stream file,
"config_img ": octet-stream file,
"dopm": octet-stream file
}
从API要求的数据看,php curl
发送post数据时, 构造的post请求体要有两个content-type
一个为普通的数据Content-Type: application/json
一个要求为content-type: octet-stream
, 二进制流, 主要是图片及其他格式文件转换成流的形式, 传输到API进行保存
平时都是使用curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
来设置请求body, 那么现在这样的格式要怎么构造请求体
$header = NULL;
$body = [];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
if(!is_null($header)){
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$curl_get = curl_exec($curl);
确实是用CURLFile
来将文件转换为流形式, 只是上面我在处理时, 请求超时时间太短, 导致数据流还没发送完成, 该tcp
链接就断了,
建议在一般CURL请求API时, 超时时间设置为10秒。 而向文件上传耗时太多时, 增大链接时间和超时时间
CURLOPT_FOLLOWLOCATION
, CURLOPT_TIMEOUT
$header = NULL;
$body = [
'img' => new CURLFile('imagepath', 'octet-stream', 'file_name')
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
if(!is_null($header)){
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
}
//设置链接超时时间为1分钟
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 60);
$curl_get = curl_exec($curl);
-Content-Type: application/json: json_encode
-content-type: octet-stream:
php>5.6
$file_data = array('image' => new \CURLFile(realpath($source)));
php
$file_data = array('image'=> '@' . realpath($source));//