lexpress/sf-web-browser-plugin

此包已被弃用且不再维护。未建议替代包。
最新版本(1.2.0)的此包没有可用的许可证信息。

现在可作为服务提供的支持HTTP请求的客户端。

安装次数: 59,937

依赖者: 0

建议者: 0

安全: 0

星标: 1

关注者: 4

分支: 4

类型:symfony1-plugin

1.2.0 2016-05-04 13:01 UTC

This package is not auto-updated.

Last update: 2020-01-20 06:55:28 UTC


README

sfWebBrowserPlugin 提供了一个能够发起Web请求的HTTP客户端。接口与 sfTestBrowser 类似。

可能的用途

  • 查询Web服务
  • 监控网站
  • 几个网站内容的混合
  • RSS源聚合
  • 代理到其他服务器
  • 跨域AJAX交互
  • 外国网站的API
  • 获取图片和其他类型的内容
  • ...

内容

此插件包含四个类:sfWebBrowsersfCurlAdaptersfFopenAdaptersfSocketsAdapter。单元测试可在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_fopentrue。在大多数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.outputphp.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: 初次发布