rsong/phprequest

一个轻量级的PHP HTTP客户端,实现了PSR7,使用socket/curl发送请求。

1.0.1 2018-08-02 11:05 UTC

This package is auto-updated.

Last update: 2024-09-08 16:49:59 UTC


README

它是https://github.com/ptcong/easyrequest的副本

EasyRequest

一个轻量级的PHP HTTP客户端,实现了PSR7,使用socket/curl发送请求。

特性

  • 与其他库一样,具有所有通用特性
  • 上传大文件(大于2GB)
  • 支持HTTP代理、SOCKS4、SOCKS4A、SOCKS5(CURL和Socket处理程序)。
  • 使用PSR-7 HTTP消息

要求

  • 启用Socket或安装curl扩展
  • PHP 5.3+

安装

composer require rsong/phprequest:^1.0

有时你不想使用composer,只想包含一个文件,就像我们的旧库一样(ptcong/php-http-client)。运行build/run.php脚本以获取compiled.php文件,并将其包含在脚本顶部。

用法

创建请求

Client::request方法仅创建\EasyRequest\Client类的新实例。

$request = \EasyRequest\Client::request('https://google.com');
$request = \EasyRequest\Client::request('https://google.com', 'GET', $options);
$request = \EasyRequest\Client::request('https://google.com', 'POST', $options);

// then
$request->send();
// or
$request = \EasyRequest\Client::request('https://google.com')->send();

具有默认选项

$request = \EasyRequest\Client::request('https://google.com', 'POST', array(
    'protocol_version' => '1.1',
    'method'           => 'GET',
    'header'           => array(),
    'body'             => '',
    'body_as_json'     => false,
    'query'            => array(),
    'form_params'       => array(),
    'multipart'        => array(),
    'default_header'   => true,    // add general headers as browser does
    'upload'           => false,   // wanna upload large files ?
    'cookie_jar'       => null,    // file path or CookieJarInterface

    'bindto'           => null,    // bind to an interface (IPV4 or IPV6), same as CURLOPT_INTERFACE
    'proxy'            => null,
    'proxy_type'       => null,
    'proxy_userpwd'    => null,
    'auth'             => null,

    'timeout'          => 10,      // connect timeout
    'nobody'           => false,   // get header only, you also can use HEAD method
    'follow_redirects' => false,   // boolean or integer (number of max follow redirect)
    'handler'          => null,    // handler for sending request
    'curl'             => array(), // use more curl options ?
));

设置请求选项

withOption方法将覆盖现有选项。如果你想要追加查询字符串、表单参数到当前选项,请参考以下内容。

$request = \EasyRequest\Client::request('https://google.com', 'GET', array(
    'follow_redirects' => 3,
    'query'            => 'a=b&c=d'
));

// or
$request->withOption('follow_redirects', 3);

// or
$request->withOption(array(
    'follow_redirects' => 3,
    'query'            => 'a=b&c=d'
));

快速请求

这些方法将创建新请求并立即发送,你不需要在这里调用send()方法。

$response = \EasyRequest\Client::get('https://google.com', 'GET', array(
    'follow_redirects' => 3,
    'query'            => 'a=b&c=d'
));

$response = \EasyRequest\Client::post('https://google.com', ...);
$response = \EasyRequest\Client::head('https://google.com', ...);
$response = \EasyRequest\Client::patch('https://google.com', ...);
$response = \EasyRequest\Client::delete('https://google.com', ...);

... more 

添加请求头

$request = \EasyRequest\Client::request('https://google.com', 'GET', array(
    'header' => array(
        'User-Agent' => 'Firefox 45',
        'Cookie' => 'cookie1=value1; cookie2=value2;',
        'Example' => array(
            'value 1',
            'value 2'
        )
    ),
));

// you also can use PSR7 as
$request = \EasyRequest\Client::request('https://google.com')
    ->withHeader('User-Agent', 'Firefox 45')
    ->withHeader('Example', array('value1', 'value 2'));

处理cookies

你可以使用header选项添加cookie,就像上面一样,但我们已经有了CookieJar来为你处理cookie。默认情况下,如果cookie_jar未设置,Client类将在发送请求之前自动创建一个CookieJar实例。你可以选择

  • FileCookieJar将cookies写入文件,就像浏览器一样,下次请求它将使用此文件中的cookies。
  • SessionCookieJar将cookies写入$_SESSION(记住,你已经在脚本顶部添加了session_start())
  • CookieJar仅将cookies写入数组,如果脚本运行完成,所有cookies都将丢失。
$jar = new \EasyRequest\Cookie\CookieJar;
// or
$jar = new \EasyRequest\Cookie\FileCookieJar($filePath);
// or
$jar = new \EasyRequest\Cookie\SessionCookieJar;

// add cookie from string of multiple cookies
$jar->fromString('cookie1=value1; cookie2=value2');

// add cookie with more information 
$jar->add(Cookie::parse('cookie2=value2; path=/; domain=abc.com')); 

// add cookie from \Psr\Http\Message\ResponseInterface
$jar->fromResponse($response);

// read more at \EasyRequest\Cookie\CookieJarInterface

$request = \EasyRequest\Client::request('https://google.com', 'GET', array(
    'cookie_jar' => $jar
))->send();

获取响应cookies

var_dump($jar->toArray());
// or
var_dump($request->getOption('cookie_jar')->toArray());

var_dump((string) $jar);

你可以使用$jar->getFor($domain, $path)方法获取特定域名和路径的cookies。此方法将创建一个新的包含你的cookies的CookieJar实例

var_dump($jar->getFor($domain, $path));

添加查询字符串

$options = array(
    'query' => 'a=b&c=d'
);
// or
$options = array(
    'query' => array(
        'a' => 'b',
        'c' => 'd',
        'x' => array(
            'y', 'z'
        ),
        'x2' => array(
            'y2' => 'z2'
        )
    )
);
$request = \EasyRequest\Client::request('https://google.com', 'GET', $options);

或者你可以使用withQuery方法,这是一个动态方法,可以处理一些情况

    /**
     * Add query string to request.
     *
     * @param  string|array $name      This value may be:
     *                                 - a query string
     *                                 - array of query string
     * @param  null|string  $value
     * @param  bool         $append
     * @param  bool         $recursive
     * @return self
     */
    $request->withQuery($name, $value = null, $append = true, $recursive = false);


$request->withQuery(array(
    'a' => 'b',
    'c' => 'd',
    'x' => array(
        'y', 'z'
    ),
    'x2' => array(
        'y2' => 'z2'
    )
));
// or
$request->withQuery('query=value1&key2=value2');
// or
$request->withQuery('query', 'value1');
// if you want to clear all existing query and add new, just use false for $append
$request->withQuery('query', 'value1', false);

添加表单参数

这与添加查询字符串类似

并且你可以使用withFormParam方法,就像withQuery一样

    /**
     * Add form param to request.
     *
     * @param  string|array $name      This value may be:
     *                                 - query string
     *                                 - array of query string
     * @param  null|string  $value
     * @param  bool         $append
     * @param  bool         $recursive
     * @return self
     */
    public function withFormParam($name, $value = null, $append = true, $recursive = false)

添加多部分数据

每个多部分部分都需要namecontents

$request = \EasyRequest\Client::request('https://google.com', 'GET', array(
    'multipart' => array(
        array(
            'name'     => 'input1',
            'contents' => 'value1'
        ),
        array(
            'name'     => 'input1',
            'contents' => 'value1',
            'filename' => 'custom file name.txt'
            'headers'  => array('Custom-header' => 'value'),
        )
    ),
));

// you also can use
$request
    ->withMultipart('field2', 'value2')
    ->withMultipart('field3', 'value3', 'fieldname3')
    ->withMultipart('field4', 'value4', 'fieldname4', array('Custom-Header' => 'value'))
    ->withMultipart('file5', fopen('/path/to/file'), 'filename1') // to upload file

上传文件

你可以使用多部分选项上传文件,但使用此方法更简单。

$request
    ->withFormFile('file1', '/path/to/file1', $optionalFileName = null, $optionalHeaders = array())
    ->withFormFile('file2', '/path/to/file2');

POST原始数据

$request->withBody('raw data');

POST JSON数据

用于轻松上传作为请求主体的JSON编码数据。如果消息中尚未存在Content-Type头,将添加Content-Type: application/json头。

$request->withJson(array(1,2,3));
// or
$request->withJson(json_encode(array(1,2,3)));

处理代理

你可以使用HTTP或SOCKS4、SOCKS4A、SOCKS5代理。

$request = \EasyRequest\Client::request('http://domain.com', 'POST', array(
    'proxy'         => '192.168.1.105:8888',
    'proxy_userpwd' => 'user:pass',
    'proxy_type'    => Client::PROXY_SOCKS5, // if not given, it will use this proxy as HTTP_PROXY
));

$request->withProxy('192.168.1.105:8888', 'user:pass', Client::PROXY_SOCKS5);
$request->withProxy('192.168.1.105:8888', null, Client::PROXY_SOCKS4);
$request->withProxy('192.168.1.105:8888', null, Client::PROXY_HTTP);

$request->withSocks4Proxy('192.168.1.105:8888'); 
$request->withSocks5Proxy('192.168.1.105:8888', 'user:pass'); 
$request->withHttpProxy('192.168.1.105:8888', 'user:pass'); 

基本认证

$request = \EasyRequest\Client::request('http://domain.com', 'POST', array(
    'auth' => 'user:pass',
));

绑定请求到接口

$request = \EasyRequest\Client::request('http://domain.com', 'POST', array(
    'bindto' => '123.123.123.123', // same as CURLOPT_INTERFACE option
));

获取响应

$request = \EasyRequest\Client::request('http://domain.com', 'POST');
$response = $request->send();

// Returns \Psr\Http\Message\RequestInterface
var_dump($request->getRequest());

// Returns \Psr\Http\Message\ResponseInterface
// Or null if request is not sent or failure
var_dump($request->getResponse());

var_dump($response);

在使用跟随重定向选项时,有时您可能想获取当前URL(最后一个重定向的URL)。

getCurrentUri 方法将返回 \Psr\Http\Message\UriInterface

$request->getCurrentUri();
$response = $request->getResponse();

// you can use PSR7 here
$response->getHeaders();
$response->getHeader('Set-Cookie');
$response->getHeaderLine('Location');

$response->getProtocolVersion();

echo (string) $response->getBody();

获取重定向请求

当使用跟随重定向选项时,有时您想获取所有请求和响应。

每个请求和响应都遵循PSR7

var_dump($request->getRequests());

获取响应

var_dump($request->getResponses());

获取调试信息

当一个请求失败时,您可以使用 $request->getError() 来查看错误信息。

并使用 $request->getDebug() 来查看一些调试信息。