请求后端api时, 后端接收的数据格式如下所示:
<code class="bash">请求方法: 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
}
</code>从API要求的数据看,php curl发送post数据时, 构造的post请求体要有两个content-type
一个为普通的数据Content-Type: application/json
一个要求为content-type: octet-stream, 二进制流, 主要是图片及其他格式文件转换成流的形式, 传输到API进行保存
平时都是使用curl_setopt($curl, CURLOPT_POSTFIELDS, $body);来设置请求body, 那么现在这样的格式要怎么构造请求体
立即学习“PHP免费学习笔记(深入)”;
<code class="php">
$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);
</code>请求后端api时, 后端接收的数据格式如下所示:
<code class="bash">请求方法: 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
}
</code>从API要求的数据看,php curl发送post数据时, 构造的post请求体要有两个content-type
一个为普通的数据Content-Type: application/json
一个要求为content-type: octet-stream, 二进制流, 主要是图片及其他格式文件转换成流的形式, 传输到API进行保存
平时都是使用curl_setopt($curl, CURLOPT_POSTFIELDS, $body);来设置请求body, 那么现在这样的格式要怎么构造请求体
立即学习“PHP免费学习笔记(深入)”;
<code class="php">
$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);
</code>
确实是用CURLFile来将文件转换为流形式, 只是上面我在处理时, 请求超时时间太短, 导致数据流还没发送完成, 该tcp链接就断了,
建议在一般CURL请求API时, 超时时间设置为10秒。 而向文件上传耗时太多时, 增大链接时间和超时时间
CURLOPT_FOLLOWLOCATION , CURLOPT_TIMEOUT
<code>$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);
</code>
-Content-Type: application/json: json_encode
-content-type: octet-stream:
php>5.6
<code>$file_data = array('image' => new \CURLFile(realpath($source)));</code>php
<code>$file_data = array('image'=> '@' . realpath($source));//<=5.5</code>
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号