我有以下代码:
// $postfields = array();
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
我的$postfields
变量是一个参数数组。我有一个通知,有数组到字符串转换。它起作用。
我可以使用http_build_query()
函数来取消通知,但是我使用@path_to_file
来包含帖子文件。和http_build_query()
中断文件包含。
我想知道是否有更多“正确”的方法来做到这一点。没有发出通知。
答案 0 :(得分:7)
$postfields
数组的某些值本身是什么?这很可能是导致通知的原因。 curl_setops
期望其第三个参数是一个数组,其键和值是字符串,如PHP's manual page for the function中所述,尽管可能不是很清楚:
此参数可以作为urlencoded字符串传递,例如' para1 = val1& para2 = val2& ...'或者作为一个数组,字段名称为键,字段数据为值。
在这句话中,关键点是para1 / 2和val1 / 2是字符串,如果需要,你可以将它们作为一个数组提供,其中键是para1和para2,值是val1和val2。
有两种消除通知的方法。
第一个是使用http_build_query()
并将@filepath
的使用替换为CURLFile objects。不幸的是,只有在您使用PHP 5.5或更高版本时才可以这样做。手册的页面非常简洁example of use。
如果您不能选择使用CURLFiles,那么第二方式是json_encode()
$postfields
数组的值,这些数组本身就是数组。这并不优雅,它要求您在另一侧解码JSON。
答案 1 :(得分:5)
试试这个递归函数。
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));
答案 2 :(得分:3)
使用Laravel对我有用的一件事是在请求标头中使用标签“ 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