使用 CURLOPT_POSTFIELDS 时数组 2 字符串转换
Array 2 string conversion while using CURLOPT_POSTFIELDS
我有以下代码:
// $postfields = array();
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
我的$postfields
变量是一个参数数组。我注意到有数组到字符串的转换。它确实有效。
我可以使用 http_build_query()
函数来取消通知,但是我使用 @path_to_file
来包含 post 文件。 http_build_query()
中断文件包含。
我想知道是否有更多 "proper" 方法可以做到这一点。不生成通知。
$postfields
数组的某些值本身是什么?这很可能是导致通知的原因。 curl_setops
期望它的第三个参数是一个数组,其键和值是字符串,如 PHP's manual page for the function 中所述,尽管可能不是很清楚:
This parameter can either be passed as a urlencoded string like 'para1=val1¶2=val2&...' or as an array with the field name as key and field data as value.
在此引用中,关键点是 para1/2 和 val1/2 是字符串,如果需要,您可以将它们作为数组提供,其中键为 para1 和 para2,值为val1 和 val2.
有两种消除通知的方法。
第一个是使用http_build_query()
并用CURLFile objects. This is only possible if you're using PHP 5.5 or above, unfortunately. The manual's page has a pretty clear and simple example of use替换你对@filepath
的使用。
如果您不适合使用 CURLFiles,那么 第二种 方法是 json_encode()
您的 $postfields
数组的值,它们本身就是数组.这并不优雅,它需要你解码另一边的 JSON。
如果你想发送多维数组,j11e 的答案将不起作用
试试这个递归函数。
https://gist.github.com/yisraeldov/ec29d520062575c204be7ab71d3ecd2f
<?php
function build_post_fields( $data,$existingKeys='',&$returnArray=[]){
if(($data instanceof CURLFile) or !(is_array($data) or is_object($data))){
$returnArray[$existingKeys]=$data;
return $returnArray;
}
else{
foreach ($data as $key => $item) {
build_post_fields($item,$existingKeys?$existingKeys."[$key]":$key,$returnArray);
}
return $returnArray;
}
}
你可以这样使用它。
curl_setopt($ch, CURLOPT_POSTFIELDS, build_post_fields($postfields));
使用 Laravel 对我有用的一件事是在请求 header 中使用标签 'Content-Type: application/json',然后发送我的数据 json 编码如下:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Accept: application/json'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
在接收请求参数的函数中我没有使用json解码函数,我访问参数就像
$request->something
经过一个小时的研究,这里是我修复代码的方式:
$strVar = '';
if ($data) {
$ea = build_post_fields($data);
foreach($ea as $key=>$val) {
$strVar.= "$key=$val&";
}
}
/* eCurl */
$curl = curl_init($url);
/* Set Array data to POST */
curl_setopt( $curl, CURLOPT_POSTFIELDS, ($strVar) );
下面是我从@Yisrael Dov 那里得到的函数:
function build_post_fields( $data, $existingKeys='', $returnArray=[]){
if(($data instanceof CURLFile) or !(is_array($data) or is_object($data))){
$returnArray[$existingKeys]=$data;
return $returnArray;
}
else{
foreach ($data as $key => $item) {
build_post_fields($item,$existingKeys?$existingKeys."[$key]":$key,$returnArray);
}
return $returnArray;
}
}
完美!您可以 post 一个深度数组,例如:
$post_var = array(
'people' => array('Lam', 'Hien', 'Nhi'),
'age' => array(12, 22, 25)
);
美好的一天!
我有以下代码:
// $postfields = array();
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
我的$postfields
变量是一个参数数组。我注意到有数组到字符串的转换。它确实有效。
我可以使用 http_build_query()
函数来取消通知,但是我使用 @path_to_file
来包含 post 文件。 http_build_query()
中断文件包含。
我想知道是否有更多 "proper" 方法可以做到这一点。不生成通知。
$postfields
数组的某些值本身是什么?这很可能是导致通知的原因。 curl_setops
期望它的第三个参数是一个数组,其键和值是字符串,如 PHP's manual page for the function 中所述,尽管可能不是很清楚:
This parameter can either be passed as a urlencoded string like 'para1=val1¶2=val2&...' or as an array with the field name as key and field data as value.
在此引用中,关键点是 para1/2 和 val1/2 是字符串,如果需要,您可以将它们作为数组提供,其中键为 para1 和 para2,值为val1 和 val2.
有两种消除通知的方法。
第一个是使用http_build_query()
并用CURLFile objects. This is only possible if you're using PHP 5.5 or above, unfortunately. The manual's page has a pretty clear and simple example of use替换你对@filepath
的使用。
如果您不适合使用 CURLFiles,那么 第二种 方法是 json_encode()
您的 $postfields
数组的值,它们本身就是数组.这并不优雅,它需要你解码另一边的 JSON。
如果你想发送多维数组,j11e 的答案将不起作用
试试这个递归函数。
https://gist.github.com/yisraeldov/ec29d520062575c204be7ab71d3ecd2f
<?php
function build_post_fields( $data,$existingKeys='',&$returnArray=[]){
if(($data instanceof CURLFile) or !(is_array($data) or is_object($data))){
$returnArray[$existingKeys]=$data;
return $returnArray;
}
else{
foreach ($data as $key => $item) {
build_post_fields($item,$existingKeys?$existingKeys."[$key]":$key,$returnArray);
}
return $returnArray;
}
}
你可以这样使用它。
curl_setopt($ch, CURLOPT_POSTFIELDS, build_post_fields($postfields));
使用 Laravel 对我有用的一件事是在请求 header 中使用标签 'Content-Type: application/json',然后发送我的数据 json 编码如下:
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Accept: application/json'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
在接收请求参数的函数中我没有使用json解码函数,我访问参数就像
$request->something
经过一个小时的研究,这里是我修复代码的方式:
$strVar = '';
if ($data) {
$ea = build_post_fields($data);
foreach($ea as $key=>$val) {
$strVar.= "$key=$val&";
}
}
/* eCurl */
$curl = curl_init($url);
/* Set Array data to POST */
curl_setopt( $curl, CURLOPT_POSTFIELDS, ($strVar) );
下面是我从@Yisrael Dov 那里得到的函数:
function build_post_fields( $data, $existingKeys='', $returnArray=[]){
if(($data instanceof CURLFile) or !(is_array($data) or is_object($data))){
$returnArray[$existingKeys]=$data;
return $returnArray;
}
else{
foreach ($data as $key => $item) {
build_post_fields($item,$existingKeys?$existingKeys."[$key]":$key,$returnArray);
}
return $returnArray;
}
}
完美!您可以 post 一个深度数组,例如:
$post_var = array(
'people' => array('Lam', 'Hien', 'Nhi'),
'age' => array(12, 22, 25)
);
美好的一天!