支付宝扫一扫付款
微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
BrowserKit组件模拟浏览器行为,让你能够程序化地制造请求、对链接的点击以及表单提交。
你可以通过下述两种方式安装:
通过Composer安装(Packagist上的symfony/browser-kit
)
通过官方Git宝库(https://github.com/symfony/browser-kit)
然后,包容vendor/autoload.php
文件,以开启Composer提供的自动加载机制。否则,你的程序将无法找到这个Symfony组件的类。
本组件只提供抽象的client,并不提供任何可以用于HTTP层的后端。
要创建你自己的客户端,必须继承 Client
抽象类,然后实现其 doRequest()
方法。该方法接收一个请求并返回一个响应:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | namespace Acme;
use Symfony\Component\BrowserKit\Client as BaseClient;
use Symfony\Component\BrowserKit\Response;
class Client extends BaseClient
{
protected function doRequest($request)
{
// ... convert request into a response
// ... 把请求转换为响应
return new Response($content, $status, $headers);
}
} |
基于HTTP layer的一个简单的client实现,可以看看 Goutte。基于 HttpKernelInterface
的实现,看一下由 HttpKernel组件 提供的 Client
。
使用 request()
来制造HTTP requests。前两个参数分别是HTTP method和请求的URL:
1 2 3 4 | use Acme\Client;
$client = new Client();
$crawler = $client->request('GET', 'http://symfony.com'); |
由 request()
方法返回的值,是一个 Crawler
类的实例,这个实例来自 DomCrawler组件,该组件能够程式化地访问和遍历HTML元素。
Crawler
对象有能力模拟对链接的点击。首先,把链接的文本传入 selectLink()
方法,该方法返回一个 Link
对象。然后再把这个对象传入 click()
方法, 该方法负责把所需的HTTP GET请求模拟成链接点击:
1 2 3 4 5 6 | use Acme\Client;
$client = new Client();
$crawler = $client->request('GET', 'http://symfony.com');
$link = $crawler->selectLink('Go elsewhere...')->link();
$client->click($link); |
Crawler
对象有能力选择表单。首先,用 selectButton()
方法来选择任意表单的按钮。然后,使用 form()
来选择该按钮的归属表单。
选择了表单之后,填充表单数据,并使用 submit()
方法(利用所需的HTTP POST请求来提交表单内容) 来发送表单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | use Acme\Client;
// make a real request to an external site
// 制造一个对外部网站的真实请求
$client = new Client();
$crawler = $client->request('GET', 'https://github.com/login');
// select the form and fill in some values
// 选取表单,并填充一些值
$form = $crawler->selectButton('Log in')->form();
$form['login'] = 'symfonyfan';
$form['password'] = 'anypass';
// submit that form
// 提交此表单
$crawler = $client->submit($form); |
The Client
implementation exposes cookies (if any) through a
CookieJar
, which allows you to store and
retrieve any cookie while making requests with the client:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | use Acme\Client;
// Make a request
// 制造一个请求
$client = new Client();
$crawler = $client->request('GET', 'http://symfony.com');
// Get the cookie Jar
// 取得饼干罐对象
$cookieJar = $client->getCookieJar();
// Get a cookie by name
// 根据cookie名称取得cookie
$cookie = $cookieJar->get('name_of_the_cookie');
// Get cookie data
// 取得cookie数据
$name = $cookie->getName();
$value = $cookie->getValue();
$raw = $cookie->getRawValue();
$secure = $cookie->isSecure();
$isHttpOnly = $cookie->isHttpOnly();
$isExpired = $cookie->isExpired();
$expires = $cookie->getExpiresTime();
$path = $cookie->getPath();
$domain = $cookie->getDomain(); |
这些方法只返回尚未过期的cookie。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | use Acme\Client;
// Make a request
// 制造一个请求
$client = new Client();
$crawler = $client->request('GET', 'http://symfony.com');
// Get the cookie Jar
// 取得饼干罐对象
$cookieJar = $client->getCookieJar();
// Get array with all cookies
// 取得全部cookie的数组
$cookies = $cookieJar->all();
foreach ($cookies as $cookie) {
// ...
}
// Get all values
// 获取全部cookie的值
$values = $cookieJar->allValues('http://symfony.com');
foreach ($values as $value) {
// ...
}
// Get all raw values
// 获取全部原生的值
$rawValues = $cookieJar->allRawValues('http://symfony.com');
foreach ($rawValues as $rawValue) {
// ...
} |
你也可以创建cookie并把它们装到cookie Jar中,以便将饼干罐注入到客户端的构造器中:
客户端存有你的全部请求,允许你在历史记录中回退和前进:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | use Acme\Client;
// make a real request to an external site
// 制造一个对外部网站的真实请求
$client = new Client();
$client->request('GET', 'http://symfony.com');
// select and click on a link
// 选中并点击一个链接
$link = $crawler->selectLink('Documentation')->link();
$client->click($link);
// go back to home page
// 退回首页
$crawler = $client->back();
// go forward to documentation page
// 前进到文档页
$crawler = $client->forward(); |
使用 restart()
可以删除客户端的历史记录。它同时会删除全部cookies:
1 2 3 4 5 6 7 8 9 10 | use Acme\Client;
// make a real request to an external site
// 制造一个对外部网站的真实请求
$client = new Client();
$client->request('GET', 'http://symfony.com');
// delete history
// 删除历史记录
$client->restart(); |
本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。