模块

Request_Client_HTTP
继承自 Request_Client_External
继承自 Request_Client

Request_Client_External HTTP 驱动使用 php-http 扩展处理外部请求。 要使用该驱动,在执行外部请求之前确保以下内容已完成。最好是在应用引导中。

// 在应用引导中
Request_Client_External::$client = 'Request_Client_HTTP';
example
package
BootPHP
category
Base
author
Tinsh
copyright
© 2005-2016 Kilofox Studio

该类在 SYSPATH/classes/request/client/http.php 第 19 行声明。

属性

public static string $client

定义默认使用的外部客户端

string(19) "Request_Client_Curl"

protected Cache $_cache

请求缓存的缓存库

protected array $_options

curl 选项

方法

public __construct( [ array $params = array(0) ] ) (在 Request_Client_HTTP 中定义)

创建一个新的 `Request_Client` 对象,允许依赖注入。

参数

  • array $params = array(0) - 参数

Tags

源代码

public function __construct(array $params = array())
{
	// 检查 PECL HTTP 支持请求
	if (!http_support(HTTP_SUPPORT_REQUESTS))
	{
		throw new Request_Exception('Need HTTP request support!');
	}
	// 继续
	parent::__construct($params);
}

public _send_message( Request $request ) (在 Request_Client_HTTP 中定义)

发送 HTTP 消息 Request 给远程服务器并处理响应。

参数

  • Request $request required - 要发送的请求

返回值

  • Response

源代码

public function _send_message(Request $request)
{
	$http_method_mapping = array(
		HTTP_Request::GET => HTTPRequest::METH_GET,
		HTTP_Request::HEAD => HTTPRequest::METH_HEAD,
		HTTP_Request::POST => HTTPRequest::METH_POST,
		HTTP_Request::PUT => HTTPRequest::METH_PUT,
		HTTP_Request::DELETE => HTTPRequest::METH_DELETE,
		HTTP_Request::OPTIONS => HTTPRequest::METH_OPTIONS,
		HTTP_Request::TRACE => HTTPRequest::METH_TRACE,
		HTTP_Request::CONNECT => HTTPRequest::METH_CONNECT,
	);
	// 创建 http 请求对象
	$http_request = new HTTPRequest($request->uri(), $http_method_mapping[$request->method()]);
	if ($this->_options)
	{
		// 设置自定义选项
		$http_request->setOptions($this->_options);
	}
	// 设置头部
	$http_request->setHeaders($request->headers()->getArrayCopy());
	// 设置 cookies
	$http_request->setCookies($request->cookie());
	// 设置查询数据(?foo=bar&bar=foo)
	$http_request->setQueryData($request->query());
	// 设置主体
	if ($request->method() == HTTP_Request::PUT)
	{
		$http_request->addPutData($request->body());
	}
	else
	{
		$http_request->setBody($request->body());
	}
	try
	{
		$http_request->send();
	}
	catch (HTTPRequestException $e)
	{
		throw new Request_Exception($e->getMessage());
	}
	catch (HTTPMalformedHeaderException $e)
	{
		throw new Request_Exception($e->getMessage());
	}
	catch (HTTPEncodingException $e)
	{
		throw new Request_Exception($e->getMessage());
	}
	// 创建响应
	$response = $request->create_response();
	// 构建响应
	$response->status($http_request->getResponseCode())
		->headers($http_request->getResponseHeader())
		->cookie($http_request->getResponseCookies())
		->body($http_request->getResponseBody());
	return $response;
}

public execute_request( Request $request ) (在 Request_Client_External 中定义)

处理请求,执行由 Route 确定的请求的控制器动作。

  1. 在调用控制器动作之前,将调用 Controller::before 方法。
  2. 然后调用控制器动作。
  3. 在调用控制器动作之后,将调用 Controller::after 方法。

默认情况下,来自控制器的输出被捕获并返回,并不发送头。

$request->execute();

参数

  • Request $request required - 请求对象

Tags

返回值

  • Response

源代码

public function execute_request(Request $request)
{
	if (BootPHP::$profiling)
	{
		// 设置 benchmark 名称
		$benchmark = '"' . $request->uri() . '"';
		if ($request !== Request::$initial && Request::$current)
		{
			// 添加父请求 URI
			$benchmark .= ' ? "' . Request::$current->uri() . '"';
		}
		// 启动 benchmarking
		$benchmark = Profiler::start('Requests', $benchmark);
	}
	// 保存当前活动请求,并用新的请求替换当前的
	$previous = Request::$current;
	Request::$current = $request;
	// 解决 POST 字段
	if ($post = $request->post())
	{
		$request->body(http_build_query($post, NULL, '&'))
			->headers('content-type', 'application/x-www-form-urlencoded');
	}
	// 如果 BootPHP 暴露,设置 user-agent
	if (BootPHP::$expose)
	{
		$request->headers('user-agent', 'BootPHP Framework ' . BootPHP::VERSION);
	}
	try
	{
		$response = $this->_send_message($request);
	}
	catch (Exception $e)
	{
		// 恢复上一个请求
		Request::$current = $previous;
		if (isset($benchmark))
		{
			// 删除 benchmark,无效了
			Profiler::delete($benchmark);
		}
		// 重新抛出异常
		throw $e;
	}
	// 恢复上一个请求
	Request::$current = $previous;
	if (isset($benchmark))
	{
		// 停止 benchmark
		Profiler::stop($benchmark);
	}
	// 返回响应
	return $response;
}

public static factory( [ array $params = array(0) , string $client = NULL ] ) (在 Request_Client_External 中定义)

工厂方法,根据传递的客户端名,创建一个新的 Request_Client_External 对象,或在默认情况下默认为 Request_Client_External::$client。

Request_Client_External::$client 可以在应用引导中设置。

参数

  • array $params = array(0) - 要传递给客户端的参数
  • string $client = NULL - 要使用的外部客户端

Tags

返回值

  • Request_Client_External

源代码

public static function factory(array $params = array(), $client = NULL)
{
	if ($client === NULL)
	{
		$client = Request_Client_External::$client;
	}
	$client = new $client($params);
	if (!$client instanceof Request_Client_External)
	{
		throw new Request_Exception('Selected client is not a Request_Client_External object.');
	}
	return $client;
}

public options( [ mixed $key = NULL , mixed $value = NULL ] ) (在 Request_Client_External 中定义)

设置与获取请求的选项。

参数

  • mixed $key = NULL - 选项名,或选项数组
  • mixed $value = NULL - 选项值

返回值

  • mixed
  • Request_Client_External

源代码

public function options($key = NULL, $value = NULL)
{
	if ($key === NULL)
		return $this->_options;
	if (is_array($key))
	{
		$this->_options = $key;
	}
	elseif ($value === NULL)
	{
		return Arr::get($this->_options, $key);
	}
	else
	{
		$this->_options[$key] = $value;
	}
	return $this;
}

public cache( [ [HTTP_Cache] $cache = NULL ] ) (在 Request_Client 中定义)

内部缓存引擎的 Getter 与 setter,用来缓存响应(如果可用且有效)。

参数

  • [HTTP_Cache] $cache = NULL - 缓存引擎

返回值

  • [HTTP_Cache]
  • [Request_Client]

源代码

public function cache(HTTP_Cache $cache = NULL)
{
	if ($cache === NULL)
		return $this->_cache;
	$this->_cache = $cache;
	return $this;
}

public execute( Request $request ) (在 Request_Client 中定义)

处理请求,执行由 Route 确定的请求的控制器动作。

  1. 在调用控制器动作之前,将调用 Controller::before 方法。
  2. 然后调用控制器动作。
  3. 在调用控制器动作之后,将调用 Controller::after 方法。

默认情况下,来自控制器的输出被捕获并返回,并不发送头。

$request->execute();

参数

  • Request $request required - $request

返回值

  • Response

源代码

public function execute(Request $request)
{
	if ($this->_cache instanceof HTTP_Cache)
		return $this->_cache->execute($this, $request);
	return $this->execute_request($request);
}