php使用curl请求数据是很常见的,但是根据HTTP/1.1 协议下的POST提交数据编码方式的不同,使用curl函数参数的选择也是有所区别的。
请求报文头header中的 Content-Type标记着传输的编码方式供服务端识别,以下根据Content-Type的不同正确使用curl传输数据
一.application/x-www-form-urlencoded方式:
1.普通类似web表单数据:
curl方法:
public function curl_post($data, $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$tmpInfo = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Errno' . curl_error($ch);
}
curl_close($ch);
return $tmpInfo;
}
处理示例:
请求:
public function test2(){
$template = array(
'touser' => 'test1',
'template_id' => '11',
'url' => 'http://www.test.com',
'topcolor' => '#EEEEEE',
'data' => array('t1','t2','t3')
);
$data = $template;
$url = "http://127.0.0.1/jytest/test1";
$this->curl_post($data, $url);
}
接收处理:
public function test1(){
$res = $_POST;
$content = '';
$content = $content.$res['touser'].', ';
$content = $content.$res['template_id'].', ';
$content = $content.$res['url'].', ';
$content = $content.$res['topcolor'].', ';
$content = $content.serialize($res['data']).', ';
$filePath = "./test.txt";
file_put_contents($filePath,$content);
}
test.txt文件内容是: test1, 11, http://www.test.com, #EEEEEE, s:5:”Array”;,
可以看出 提交的数组无法正确接收
如果要传数组,则要将curl_post方法中的
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
改为
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
2.传json,沿用上面的curl_post方法不变,只是将json内容当做字符串内容传递,要有个头部字段名与之对应,方面接收
处理示例:
public function test2(){
//请求方
$template = array(
'touser' => 'test1',
'template_id' => '11',
'url' => 'http://www.test.com',
'topcolor' => '#EEEEEE',
'data' => array('t1','t2','t3')
);
$data['data'] = json_encode($template);
$url = "http://127.0.0.1/test/test1";
$res = $this->curl_post($data, $url);
print_r(json_decode($res,1));
}
接收处理:
public function test1(){
//接收处理返回
$data = json_decode($_POST['data'],true);
$content=serialize($data);
$filePath = "./test.txt";
file_put_contents($filePath,$content);
}
test.txt文件内容是:
a:5:{s:6:”touser”;s:3:”test1”;s:11:”template_id”;s:2:”11”;s:3:”url”;s:19:”http://www.test.com“;s:8:”topcolor”;s:7:”#EEEEEE”;s:4:”data”;a:3:{i:0;s:2:”t1”;i:1;s:2:”t2”;i:2;s:2:”t3”;}}
可以看出是数组$template的内容
二.直接application/json方式:
curl设置header将Content-Type改为application/json
curl方法
private function curl_postjson($data,$urlcon){
$ch = curl_init($urlcon); //请求的URL地址
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//$data JSON类型字符串
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($data)));
$tmpInfo = curl_exec($ch);
curl_close($ch);
return $tmpInfo;
}
请求:
public function test2(){
//请求方
$template = array(
'touser' => 'test1',
'template_id' => '11',
'url' => 'http://www.test.com',
'topcolor' => '#EEEEEE',
'data' => array('t1','t2','t3')
);
//不需要用单独的字段名对应json数组,服务端要用file_get_contents('php://input')接收
$data = json_encode($template);
$url = "http://127.0.0.1/test/test1";
$res = $this->curl_postjson(json_encode($data), $url);
print_r(json_decode($res,1));
}
接收处理:
public function test1(){
$filePath = "./test.txt";
//不需要使用字段名来接收json数组
$res = file_get_contents('php://input');
$res = json_decode($res,1) ;
$content = serialize($res);
file_put_contents($filePath,$content);
echo json_encode($res);
}
test.txt文件内容是:
s:110:”{“touser”:”test1”,”template_id”:”11”,”url”:”http:\/\/www.test.com”,”topcolor”:”#EEEEEE”,”data”:[“t1”,”t2”,”t3”]}”;