欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

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

程序员文章站 2022-06-06 15:33:57
...
请求后端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);

回复内容:

请求后端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));//
相关标签: php http