jdriscoll/curl-psr

用于使用 PSR-7 请求和响应对象与 Curl 的工具

v1.1.3 2019-06-16 14:29 UTC

This package is auto-updated.

Last update: 2024-09-16 00:13:05 UTC


README

这允许您使用 PSR-7 对象运行 Curl 请求。这有几个好处

  1. 它让您远离复杂的 Curl 语法,这在您要做的不仅仅是下载文件时特别有用
  2. 如果您使用代理,由于 PSR-7 ServerRequest 与 PSR-7 Request 兼容,因此代码更少。换句话说,修改后的 $request 通常可以正常工作。
  3. 发送响应更简单
  4. 流式响应更加直接

用法

    $handler = new \CurlPsr\Handler();
    $response = $handler->run(
        $request->withUri(
            $request->getUri()
                ->withPath("/")
                ->withHost("example.org")
                ->withScheme("http")
                ->withPort(80)
        ),
        true,
        10000
    );

这个的主要目的是使 JSON API 代理更简单。

限制

这个不试图支持每个可能的 Curl 特性,也不支持 PSR-7 请求/响应中可以表达的所有内容。始终应该工作的关键功能包括

  • 带有适当保留头部的 HEAD 请求
  • 到可能或可能不流式的 JSON 端点的 GET 请求
  • 通过 POST 传递的 JSON-RPC 请求和响应
  • DELETE 请求
  • OPTIONS 请求
  • 短 JSON 资源的 PUT 请求

高级用法

如果您想并行执行两个或更多请求,您可以这样做。为此,您可以使用

    $handler = new \CurlPsr\Handler();
    $responses = $handler->withTimeout(10000)->runSimple(
        $request1,
        $request2
    );
    foreach($responses as $k => $response) {
        if($response->getBody()->getSize()) {
            echo "" . $response->getUri();
            echo "" . $response->getBody();
        }
    }

runSimple() 的返回值实际上是一个迭代器,它将在多个对象上多次运行:一次用于头部,一次或多次用于体块,最后一次当传输已知完成时。响应附加的体将始终与最新的数据包保持一致,但不会报告大小,直到完成。

如果您想使用特定的键来更容易地区分响应,可以使用 runMap()

    $handler = new \CurlPsr\Handler();
    $responses = $handler->withTimeout(10000)->runMap([
        "a" => $request1,
        "b" => $request2
    ]);
    foreach($responses as $k => $response) {
        if($response->getBody()->getSize()) {
            echo "" . $response->getUri();
            echo "" . $response->getBody();
        }
    }