php下使用curl进行多种数据编码方式的POST请求

来源:互联网 发布:淘宝订单编号生成规则 编辑:程序博客网 时间:2024/06/07 08:01

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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

处理示例:

请求:

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);        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

接收处理:

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);    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

test.txt文件内容是: test1, 11, http://www.test.com, #EEEEEE, s:5:”Array”;,

可以看出 提交的数组无法正确接收 
如果要传数组,则要将curl_post方法中的

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  • 1

改为

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
  • 1

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)); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

接收处理:

public function test1(){     //接收处理返回      $data = json_decode($_POST['data'],true);          $content=serialize($data);      $filePath = "./test.txt";            file_put_contents($filePath,$content);        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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;    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

请求:

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));    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

接收处理:

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);    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

test.txt文件内容是: 
s:110:”{“touser”:”test1”,”template_id”:”11”,”url”:”http:\/\/www.test.com”,”topcolor”:”#EEEEEE”,”data”:[“t1”,”t2”,”t3”]}”;