使用 HTTP 客户端

创建一个请求

  1. use Swoft\HttpClient\Client;
  2. $client = new Client([
  3. // 基础的 URI,将用于此对象后续发起的请求
  4. 'base_uri' => 'http://www.swoft.org',
  5. // 请求的默认超时时间
  6. 'timeout' => 2,
  7. ]);

Client 的构造方法接受一个 Options 数组,用于配置客户端,以为为各个参数的说明。

base_uri ( string | UriInterface ) 基础的 URI,将用户后续的请求,将与 request($uri) 的 $uri 合并成一个完整的 URI

timeout ( int | float ) 设置请求的超时时间,单位为秒

adapter ( string ) 设置指定的客户端适配器,可选参数包括 co, curlco 指使用 Swoole 提供的协程 HTTP 客户端作为驱动,curl 指使用 CURL扩展 作为驱动

发送一个请求

  1. use Swoft\HttpClient\Client;
  2. $client = new Client();
  3. $response = $client->get('http://www.swoft.org')->getResponse();
  4. $response = $client->post('http://www.swoft.org')->getResponse();
  5. $response = $client->head('http://www.swoft.org')->getResponse();
  6. $response = $client->options('http://www.swoft.org')->getResponse();
  7. $response = $client->patch('http://www.swoft.org')->getResponse();
  8. $response = $client->put('http://www.swoft.org')->getResponse();
  9. $response = $client->delete('http://www.swoft.org')->getResponse();

所有请求都基于 request(string $method, string|UriInterface $uri, array $options) 方法,如有非预置自定义方法请求,可以使用此方法自行构造

  1. $method = 'GET';
  2. /** @var Response $response */
  3. $response = $client->request($method, '/', [
  4. 'base_uri' => 'http://www.swoft.org',
  5. ])->getResponse();

并发请求

注意并发请求仅作用于co适配器下,若在curl驱动下此操作会退化为同步阻塞操作

  1. $request1 = $client->get('http://www.swoft.org');
  2. $request2 = $client->get('http://www.swoft.org');
  3. $request3 = $client->get('http://www.swoft.org');
  4. $response1 = $request1->getResponse();
  5. $response2 = $request2->getResponse();
  6. $response3 = $request3->getResponse();

HttpResult 对象

\Swoft\HttpClient\HttpResult 为请求后的返回结果,该结果不是请求返回的内容,注意调用后需统一调用 getResponse()getResult() 方法获取Response 对象,框架将默认定义为延迟收包,调用这一方法才进行收包处理,当在协程驱动下,可实现 defer 特性和并发调用具体可参考 Swoole 关于并发操作的说明 https://wiki.swoole.com/wiki/page/p-coroutine_multi_call.html
这里需要注意的是 getResponse()getResult() 的返回值是不一样的,getResponse() 返回的是一个Response 对象,而 getResult() 返回的则是 Response 对象的 Content 属性,是一个字符串类型

Response 对象

\Swoft\Core\Response 基于 PSR-7 实现,继承于 Psr\Http\Message\ResponseInterface,使用方法在此不做过多的阐述,可直接参考相关规范

Raw 请求

通过对 Options 设置 body 参数设置发送请求的 Body,此参数仅允许字符串格式

  1. /** @var Response $response */
  2. $response = $client->post('/', [
  3. 'base_uri' => 'http://www.swoft.org',
  4. 'body' => 'value',
  5. ])->getResponse();

Form 请求

在表单提交下我们提供了form_params参数,该参数会自动在Header带上application/x-www-form-urlencodedContent-Type

  1. /** @var Response $response */
  2. $response = $client->post('/', [
  3. 'base_uri' => 'http://www.swoft.org',
  4. 'form_params' => [
  5. 'key' => 'value',
  6. ],
  7. ])->getResponse();

Json 请求

在表单提交下我们提供了json参数,该参数会自动在Header带上application/jsonContent-Type,并格式化数组为json结构

  1. /** @var Response $response */
  2. $response = $client->post('/', [
  3. 'base_uri' => 'http://www.swoft.org',
  4. 'json' => [
  5. 'key' => 'value',
  6. ],
  7. ])->getResponse();