curl - 发送GET/POST请求

  • 作者:KK

  • 发表日期:2017.3.2


GET请求倒是简单直接,在URL上加参数就行

$url = 'http://xxx.com/yy/zz?aa=11&bb=22';

$curlHandler = curl_init();
curl_setopt($curlHandler, CURLOPT_URL, $url);
curl_setopt($curlHandler, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curlHandler);
curl_close($curlHandler);

echo $result;

POST请求要设置两个选项

$url = 'http://xxx.com/yy/zz';

$curlHandler = curl_init();
curl_setopt($curlHandler, CURLOPT_URL, $url);
curl_setopt($curlHandler, CURLOPT_RETURNTRANSFER, 1);


curl_setopt($curlHandler, CURLOPT_POST, 1); //用POST方法请求
curl_setopt($curlHandler, CURLOPT_POSTFIELDS, 'aa=11&yy=22'); //设置POST的参数

$content = curl_exec($curlHandler);
curl_close($curlHandler);

POST的参数默认是UrlEncode格式

上面POST的参数是一个字符串“aa=11&yy=22”,写法跟GET参数一模一样

其实默认情况下GET和POST的参数表达都是相同的,只是各自放的位置不一样,GET请求就将参数放在网址上,POST请求就将参数放在别的地方(会随其它请求数据一起发出)

这里要科普的一个知识点就是:aa=11&bb=22 这样的参数格式,它叫UrlEncode格式

UrlEncode格式有时候会出现在一些第三方平台的API文档中,说明发送的数据是JSON或是UrlEncode


如何生成UrlEncode格式

http_build_query函数

$params = [
	'name' => 'Jay',
	'age' => 999,
];
echo http_build_query($params);

会输出name=Jay&age=999


POST发送JSON格式数据

直接把POSTFIELDS设置成一个JSON字符串就行

$url = 'http://xxx.com/yy/zz';

$curlHandler = curl_init();
curl_setopt($curlHandler, CURLOPT_URL, $url);
curl_setopt($curlHandler, CURLOPT_RETURNTRANSFER, 1);


curl_setopt($curlHandler, CURLOPT_POST, 1);
$json = json_encode(['aa' => 11, 'bb' => 22]);
curl_setopt($curlHandler, CURLOPT_POSTFIELDS, $json);

$content = curl_exec($curlHandler);
curl_close($curlHandler);

如果接收端是PHP语言的,则默认情况下$_POST数组会是个空数组,因为POST数组是PHP引擎将UrlEncode格式的内容转换而成的

一旦发送来的不是UrlEncode格式,那就要另外建立解析流程将这个json格式解析为POST数组了,接收端应该这么做:

$postString = file_get_contents('php://input');
$_POST = json_decode($postString, 1);
print_r($_POST);

php://input这是一个特殊的文件路径,指的是本次PHP会话被运行起来时外部所输入的数据,在Web请求下,所谓的输入数据自然就是发送的POST数据了

所以上面curl_setopt($curlHandler, CURLOPT_POSTFIELDS, $json);这里设置POST数据时,甚至可以设置为任何内容,包括二进制内容都可以,最终只要接收端能对应地解析出来就行了