lexpress / sf-web-browser-plugin
现在可作为服务提供的支持HTTP请求的客户端。
Requires
- composer/installers: ~1.0
This package is not auto-updated.
Last update: 2020-01-20 06:55:28 UTC
README
sfWebBrowserPlugin
提供了一个能够发起Web请求的HTTP客户端。接口与 sfTestBrowser
类似。
可能的用途
- 查询Web服务
- 监控网站
- 几个网站内容的混合
- RSS源聚合
- 代理到其他服务器
- 跨域AJAX交互
- 外国网站的API
- 获取图片和其他类型的内容
- ...
内容
此插件包含四个类:sfWebBrowser
、sfCurlAdapter
、sfFopenAdapter
和 sfSocketsAdapter
。单元测试可在SVN仓库中找到,需要放置在symfony应用程序的 test/
目录中。
功能
sfWebBrowser
类基于URI发起Web请求
<?php $b = new sfWebBrowser(); $b->get('http://www.example.com/'); $res = $b->getResponseText();
常用的 sfTestBrowser
方法在那里同样适用,具有流畅的接口。
<?php // Inline $b->get('http://www.example.com/')->get('http://www.google.com/')->back()->reload(); // More readable $b->get('http://www.example.com/') ->get('http://www.google.com/') ->back() ->reload();
浏览器接受绝对和相对URI
<?php $b->get('http://www.example.com/test.html'); $b->get('test.html');
get()
方法接受参数,可以是查询字符串或关联数组。
<?php $b->get('http://www.example.com/test.php?foo=bar'); $b->get('http://www.example.com/test.php', array('foo' => 'bar'));
支持POST、PUT和DELETE请求。
<?php $b->post('http://www.example.com/test.php', array('foo' => 'bar')); $b->put('http://www.example.com/test.php', array('foo' => 'bar')); $b->delete('http://www.example.com/test.php', array('foo' => 'bar'));
您可以根据需要以各种格式访问响应
<?php $myString = $b->getResponseText(); $myString = $b->getResponseBody(); // drop the <head> part $myDomDocument = $b->getResponseDom(); $myDomCssSelector = $b->getResponseDomCssSelector(); $mySimpleXml = $b->getResponseXml();
浏览器支持HTTP和HTTPS请求、代理、重定向和超时。
如果启用了[https://php.ac.cn/zlib zlib扩展],也支持Gzip和deflate编码的内容响应体。
适配器
浏览器可以使用各种适配器来执行请求,默认按以下顺序选择
sfCurlAdapter
:使用Curl获取页面。此适配器比sfFopenAdapter
快得多,但是PHP必须使用with-curl
选项编译,并且必须在php.ini
中启用curl
扩展(默认情况下很少这样做)才能正常工作。sfFopenAdapter
:使用fopen()
获取页面。fopen()
可以接受URL作为参数,前提是PHP编译时启用了套接字支持,并且在php.ini
中定义了allow_url_fopen
为true
。在大多数PHP发行版中都是这种情况,因此默认适配器几乎可以在每个平台上工作。另一方面,兼容性有代价:此适配器较慢。sfSocketsAdapter
:使用fsockopen()
获取页面。
另外,您可以在创建新的浏览器对象时明确指定适配器,如下所示
<?php // use default adapter, i.e. sfCurlAdapter $b = new sfWebBrowser(array()); // use sfFopenAdapter $b = new sfWebBrowser(array(), 'sfFopenAdapter');
目前,sfCurlAdapter
比其他适配器提供稍多的功能。具体来说,它支持多部分文件上传和cookies,这意味着您可以通过表单登录到网站以及上传文件。
<?php // upload files via a form $b = new sfWebBrowser(); $b->post($url_of_form, array( 'file_field' => '/path/to/my/local/file.jpg' )); // login to a website $b = new sfWebBrowser(array(), 'sfCurlAdapter', array('cookies' => true)); $b->post($url_of_login_form, array( 'user_field' => $username, 'pass_field' => $password ));
完整的示例可以在单元测试中找到。
错误处理
sfWebBrowser
区分两种错误类型:适配器错误和响应错误。因此,调用 sfWebBrowser
应该这样进行
<?php $b = new sfWebBrowser(); try { if (!$b->get($url)->responseIsError()) { // Successful response (eg. 200, 201, etc) } else { // Error response (eg. 404, 500, etc) } } catch (Exception $e) { // Adapter error (eg. Host not found) }
此外,您始终应记住响应内容可能包含错误的代码。将其视为“受污染的”,因此在将其输出到模板时,始终使用转义。
<?php // In the action $this->title = (string) $b->getResponseXml()->body->h1 // In the template ?> <?php echo $title // dangerous ?> <?php echo $sf_data->get('title') // correct ?>
安装
- 安装插件
$ php symfony plugin:install sfWebBrowserPlugin # for symfony 1.1 and 1.2 $ php symfony plugin-install http://plugins.symfony-project.com/sfWebBrowserPlugin # for symfony 1.0
- 清除缓存以启用自动加载以查找新类
$ symfony cc
已知限制
在所有包中均不支持Cookies、缓存和文件上传(一些此功能通过 sfCurlAdapter
可用,见上文)。
变更日志
分支
2016-05-04 | 1.2.0 稳定版
- jeromemacias:默认不保存到堆中(修复内存泄漏)
- jeromemacias:删除了对响应的交互(点击和setField方法)
- COil:在返回的异常中添加了CURL错误号
- GromNaN:将sf_web_browser作为服务注入(需要symfony1分叉具有服务容器)
- GromNaN:兼容Composer
- jeromemacias:添加了followRedirect属性(默认:true),现在可以关闭它
- CaptainJojo:更新sfCurlAdapter以初始化postfields
- IllyaSvergun:PHP 5.5 兼容性
- siimsoni:sfCurlAdapter二进制兼容性
2009-05-12 | 1.1.2 稳定版
- francois:修复sfCurlAdapter析构函数
- francois:修复了sf1.2兼容性问题,用于自定义异常
- francois:修复了一些边界情况错误并使测试通过
2009-04-22 | 1.1.1 稳定版
- francois:修复了README中对参数数组的语法错误
- bmeynell:修复了
sfCurlAdapter
中的自定义选项
2008-09-23 | 1.1.0 稳定版
- francois:将README翻译为Markdown
- francois:在
sfCurlAdapter
中添加了对自定义选项的支持 - francois:基于adoanhuu的补丁,在
sfCurlAdapter
中添加了对超时的支持 - blacksun:允许进行SSL证书验证
- francois:添加了一个测试来检查由
getResponseXML
抛出的异常 - bmeynell:在
sfCurlAdapter
中添加了对多部分文件上传的支持 - bmeynell:修复了getResponseBody()中的正则表达式,它返回一个空体
- bmeynell:
sfCurlAdapter
:添加了新选项:“cookies”、“cookies_dir”、“cookies_file”、“verbose”、“verbose_log” - bmeynell:
sfCurlAdapter
:通过将一些初始化从call()移动到构造函数中提高了速度 - tristan:简化了对无效XML响应的管理
- francois:修复了
sfFopenAdapter
错误处理程序中的错误 - bmeynell:在
sfSocketsAdapter
中添加了对分块传输编码的支持 - bmeynell:在
sfSocketsAdapter
中添加了对301重定向的支持
2007-03-27 | 1.0.1 稳定版
- bmeynell:修复了
sfCurlAdapter
导致的“Bad Request”错误响应的bug - francois:修复了当
arg_separator.output
在php.ini
中未设置为'&'时get()
的bug(来自river.bright的补丁) - francois:修复了当查询字符串已存在于URL中时
get()
的bug(基于Jeff Merlet的补丁) - francois:修复了
sfWebBrowser::__construct()
中的自动适配器决策bug
2007-03-08 | 1.0.0 稳定版
- francois: 在
sfWebBrowser::__construct()
中添加了自动适配器决策 - francois: 稍微更改了测试的 URL,以避免与 Google 的问题导致的重定向
- bmeynell: 添加了
sfSocketsAdapter
- bmeynell:
sfCurlAdapter
:更详细的错误信息和更简洁的请求设置
2007-02-22 | 0.9.6 测试版
- bmeynell, tristan: 在
sfCurlAdapter
中允许使用任何方法进行请求 - tristan: 添加了
sfWebBrowser::responseIsError()
- tristan: 添加了
sfWebBrowser::getResponseMessage()
- tristan: 对
sfFopenAdapter
中的错误管理进行了重构
2007-02-21 | 0.9.5 测试版
- bmeynell: 修复了相对 URI 尝试使用非 80 端口的问题(sfWebBrowser,132 - 146)
- bmeynell: 修复了异常时不打印主机名的小错误(sfFopenAdapter,61-62)
- bmeynell: 创建了 sfCurlAdapter 并通过所有单元测试
- bmeynell: 从 sfCurlAdapter、sfFopenAdapter 中的 call() 原型中移除了 '$changeStack = true',并将更改栈检查移动到 sfWebBrowser
- bmeynell: 将 $askeet_url 添加到 sfWebBrowserTest
- bmeynell: 在 sfWebBrowserTest 中添加了轻松切换适配器的功能
- tristan: 添加了 put() 和 delete() 公共方法
- tristan: 添加了单元测试以验证请求 HTTP 方法
2007-02-16 | 0.9.4 测试版
- francois: 将浏览器重构为多适配器
- francois: '''BC break''' 构造函数签名已更改:
new sfWebBrowser(array $headers, string $adapter_class, array $adapter_options)
- francois: 修复了尝试检索不存在头部的警告
- francois: 修复了头部大小写规范化问题
- francois: 将 setResponseXXX() 方法转换为公共方法
- francois: 修复了
initializeRequestHeaders()
中的大小写问题 - francois: 修复了单元测试 #40
2007-02-16 | 0.9.3 测试版
- tristan: 添加了对 gzip 和 deflate 的支持。
- tristan: 可以将默认请求头传递给 sfWebBrowser 的构造函数
- tristan: "Accept-Encoding" 头部根据 PHP 功能自动设置
- tristan: 修复了请求和响应头部的 case 问题
- tristan: 将 "browser options" 重命名为 "adapter options"(http://www.symfony-project.com/forum/index.php/m/21635/)
- tristan: '''BC break''' 构造函数签名已更改:
new sfWebBrowser(array $headers, array $adapter_options)
- tristan: 测试了 POST 请求
- tristan: 更改了内部存储 httpd 头部的方式
- tristan: 修复了
getResponseBody()
中的小错误 - francois: 修复了畸形头部的单元测试
2007-02-09 | 0.9.2 测试版
- francois: 修复了
getResponseXML()
中的警告
2007-02-08 | 0.9.1 测试版
- francois: 修复了一些头部的警告
- francois: 添加了许可和版权信息
2007-02-08 | 0.9.0 测试版
- francois: 初次发布