首頁 > 後端開發 > php教程 > http - PHP CURL請求後端API時(POST), 怎麼建構請求資料使請求body裡有多個boundary

http - PHP CURL請求後端API時(POST), 怎麼建構請求資料使請求body裡有多個boundary

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-08-04 09:19:47
原創
2054 人瀏覽過

請求後端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, 那麼現在這樣的格式要怎麼建構請求體

<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, 那麼現在這樣的格式要怎麼建構請求體

<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.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
怎麼學好php
來自於 1970-01-01 08:00:00
0
0
0
PHP擴充intl
來自於 1970-01-01 08:00:00
0
0
0
php數據獲取?
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板