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格式 ¶
$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数据时,甚至可以设置为任何内容,包括二进制内容都可以,最终只要接收端能对应地解析出来就行了