在使用PHP发起请求时,我们会经常使用cURL方法。具体的PHP请求方式可以参考PHPcURL请求详解一文。cURL在使用中发起POST请求。如果需要发送POST请求,需要配置两个参数,CURLOPT_POST和CURLOPT_POSTFIELDS。curl请求包源码如下:/***使用cURL方式获取接口数据*@param$uri请求的url*@param$param发起POST请求时携带的参数*@returnarray返回的数据通过请求,解析成json格式*/publicfunctionfetchApi($uri,$param=array()){//初始化curl$ch=curl_init($uri);curl_setopt_array($ch,array(//不直接输出,返回变量CURLOPT_RETURNTRANSFER=>true,//设置超时为60s,防止机器被大量超时请求卡住CURLOPT_TIMEOUT=>60));//支持POST请求}//请求数据$data=curl_exec($ch);//关闭请求curl_close($ch);//对数据进行编码,方便前端数据处理returnjson_decode($data);}POST参数如果需要使用POST方式,需要将CURLOPT_POST参数设置为true,并在CURLOPT_POSTFIELDS中传递post参数。为什么要使用http_build_query需要注意的是CURLOPT_POSTFIELDS参数只支持一维数组参数,否则会报错,可以在本地测试:为了测试这个功能,我们需要对上面的代码进行修改:将CURLOPT_POSTFIELDS=>http_build_query($param)行替换为:CURLOPT_POSTFIELDS=>$param//测试发起多维数组的curl请求publicfunctionactionTest(){$url='www.baidu.com';//这里是一个二维关联数组$param=array('foo'=>['bar'=>'cow']);$data=$this->fetchApi($url,$param);echojson_encode($数据);return$data;}//结果会报错:Array到字符串转换的错误信息如下:如果我们需要避免这种多维数组问题,我们需要使用http_build_query方法:函数声明:/**函数功能:根据数组@param$query_data生成URL-encode后的请求字符串可以是一个数组或包含公共属性的对象@param$numeric_prefix如果数组是数字下标,则使用这个值作为数字下标前缀@param$arg_separator参数分隔符,默认为&@param$enc_typeURL编码规范@returnstringURL编码字符串*/stringhttp_build_query(mixed$query_data[,string$numeric_prefix[,string$arg_separator[,int$enc_type=PHP_QUERY_RFC1738]]])instancegetdata://一维数组$data=array('foo','bar','baz','boom','cow'=>'milk','php'=>'炒作rtext处理器');echohttp_build_query($data)。"\n";echohttp_build_query($data,'myvar_');//结果://0=foo&1=bar&2=baz&3=boom&cow=milk&php=hypertext+processor//myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk&php=hypertext+processor//多维数组$param=array('foo'=>['bar'=>'cow']);echohttp_build_query($data);//结果:foo%5Bbar%5D=cow即:foo[bar]=cow结论:curl请求的POSTOPT_FIELDS只支持一维数组。如果是多维数组,则需要使用http_build_query方法,但是我建议为了规范化请求的url,应该全部使用http_build_query对POST请求的参数进行编码。参考资料PHP手册CRULOPT参数:http://php.net/manual/zh/func...PHP手册http_build_query:http://php.net/manual/zh/func...
