我做了一个curl调用函数,如下所示:
public function curl($url, $post = array()){
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_COOKIEJAR, $this->ckfile);
curl_setopt($ch, CURLOPT_COOKIEFILE, $this->ckfile);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
// curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,2);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_URL, $url);
if(!empty($post)){
$post_string = "";
foreach($post as $key=>$value) { $post_string .= $key.'='.urlencode($value).'&'; }
rtrim($post_string, '&');
curl_setopt($ch,CURLOPT_POST, count($post));
curl_setopt($ch,CURLOPT_POSTFIELDS, $post_string);
}
$res = curl_exec($ch);
if (curl_errno($ch)) {
$this->deliver_responce('201','Couldn\'t send request: ' . curl_error($ch));exit();
}
else {
$resultStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($resultStatus == 200) {
//echo "Post Successfully!";
return true;
}
else{
$this->deliver_responce('200','Request failed: HTTP status code: ' . $resultStatus);exit();
}
}
}
我必须使用要发布的URL和数组来调用它。当数组具有键和值时它起作用,但是当我嵌套数组时它不起作用。它适用于:
array(
'id'=>1,
'name'=>'apple'
)
但不适用于
array(
'id'=>5,
'cmd'=>array('password','encrypt','decrypt')
)
我认为问题出在:
foreach($post as $key=>$value) { $post_string .= $key.'='.urlencode($value).'&'; }
在我的工作中,但我不知道该怎么做。
答案 0 :(得分:0)
要创建请求uri,有一个http_build_query
函数:
if (!empty($post)) {
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS, http_build_query($post));
}
但是,根据manual(由我强调):
此参数可以作为urlencoded的字符串 string 传递,例如'para1 = val1&para2 = val2&...',也可以作为字段名称作为键和字段的 array 传递。数据作为价值。
因此,您可以尝试直接传递$post
数组,而不将其转换为字符串。
答案 1 :(得分:0)
对于这种发布数据,您应该使用JSON数据,并在服务器端解析json。但是,如果您无法控制发送数据的网址,则可以使用以下几行发送嵌套数组。无需手动转换数组inyo字符串。
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));
curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode(http_build_query($post_array)));
答案 2 :(得分:0)
解决了更改foreach循环之类的问题
foreach($post as $key=>$value) {
if (is_array($value)) {
foreach ($value as $val) {
$post_string .= $key.'[]='.urlencode($val).'&';
}
}
else{
$post_string .= $key.'='.urlencode($value).'&';
}
}