http - PHP CURL请求后端API时(POST), 怎么构造请求数据使请求body里有多个boundary

 品味a江湖_232_466 发布于 2022-11-15 13:41

请求后端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);
2 个回答
  • -Content-Type: application/json: json_encode
    -content-type: octet-stream:
    php>5.6

    $file_data = array('image' => new \CURLFile(realpath($source)));

    php<=5.5

    $file_data = array('image'=> '@' . realpath($source));//<=5.5
    2022-11-15 14:25 回答
  • 确实是用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);
    
    2022-11-15 14:25 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有