在使用 PHP 抓取网页或调用一些第三方的 API 的时候可能会遇到需要发送 GET 或者 POST 请求,例如 Google 的 reCAPTCHA 验证就需要发送 POST 请求,百度翻译的 API 也需要发送 GET 或 POST 请求,这里就来简单写一下 PHP 发送 GET 和 POST。

GET 请求

发送 GET 请求很简单,使用的函数是 file_get_contents() ,下面给名为 server.php 的文件发送 get 请求:

<?php

$url = 'http://localhost/php/test/server.php?data=hello';  //  url和参数
$result = file_get_contents($url);  //  发送get请求

file_get_contents() 函数的功能是把文件读入一个字符串,可以用来读取文件,也可以用来发送 GET 请求,参数为 url 或文件名,如果需要发送内容可以在 url 后面加参数名和参数值,下面演示给 server.php 文件发送 user 和 password:

<?php

$url = 'http://localhost/php/test/server.php?user=123&password=123';
file_get_contents($url);

url 参数的拼接和 jQuery 发送 get 或 post 请求是一样的,请求成功会返回请求到的字符串,请求失败会返回 false

POST 请求

发送 post 请求会稍微麻烦一些,需要用到 Client URL 库,关于 Client URL 的介绍可以看 http://php.net/manual/zh/intro.curl.php ,关于安装/配置可以看 http://php.net/manual/zh/curl.setup.php ,下面给 server.php 发送一个简单的 POST 请求:

<?php

$url = 'http://localhost/php/test/server.php';  //  url

$data = array('data' => 'hello');  //  要发送的数据

$ch = curl_init();  //  初始化Client URL

curl_setopt($ch, CURLOPT_URL, $url);  //  设置url

curl_setopt($ch, CURLOPT_POST, true);  //  设置请求方式为post

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //  设置要发送的数据

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  //  设置以字符串方式返回

$result = curl_exec($ch);  //  执行curl绘画

curl_close($ch);  //  关闭curl会话

echo $result;  //  输出返回的内容

下面是用到的函数说明:

curl_init(url)

初始化 Client URL 会话,接收一个 string 类型的URL,也可以为空,如果成功,返回 cURL 句柄,出错返回 false

curl_setopt(ch, option, value)

设置 curl 参数,下面是参数说明:

参数说明
ch初始化Client URL时的句柄
option选项,接收一个预定义常量
value选项值,类型可能是bool or integer or string or array or 资源

下面是用到的预定义常量的说明:

预定义常量说明
CURLOPT_URLstring类型的URL
CURLOPT_POSTTRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。
CURLOPT_POSTFIELDS全部数据使用HTTP协议中的 "POST" 操作来发送。 要发送文件,在文件名前面加上@前缀并使用完整路径。 文件类型可在文件名后以 ';type=mimetype' 的格式指定。 这个参数可以是 urlencoded 后的字符串,类似'para1=val1¶2=val2&...',也可以使用一个以字段名为键值,字段数据为值的数组。 如果value是一个数组,Content-Type头将会被设置成multipart/form-data。
CURLOPT_RETURNTRANSFERTRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。

curl 的功能很强大,不只能发送 POST,这里没有写到的预定义常量可以看 http://php.net/manual/zh/function.curl-setopt.php

curl_exec(ch)

执行 curl 会话,接收一个 curl 句柄,成功时返回请求到的相关内容,失败时返回 false

curl_close(ch)

关闭 curl 会话,释放资源,接收一个 curl 句柄,无返回值。

以上就是比较简单的 PHP 发送 get 和 post,方法有很多种,我只是写了其中的两种,关于更复杂的带 COOKIE 发送以后再写。