如何使用 Guzzlehttp/guzzle 6 发送 Cookie?

Posted

技术标签:

【中文标题】如何使用 Guzzlehttp/guzzle 6 发送 Cookie?【英文标题】:How can I send Cookies with Guzzlehttp/guzzle 6? 【发布时间】:2017-04-21 06:53:04 【问题描述】:

我需要发送带有自定义 cookie 的请求。

我尝试过这样设置 cookieJar:

$cookieJar = CookieJar::fromArray(array($cookieName=>$cookieStr),
                    'api.mobra.in');

                $res = $this->guzzleClient->request($requestMethod, $url,
                    [
                        'cookies' => [$cookieJar]
                    ]
                );

但它得到一个错误

cookies 必须是 GuzzleHttp\Cookie\CookieJarInterface 的实例

请提供示例或详细说明。 我浏览了文件,但他们没有详细提及。

谢谢!

【问题讨论】:

我试过 GuzzleHttp\Cookie\SetCookie。也许是错的。 【参考方案1】:
use GuzzleHttp\Cookie\CookieJar;

$cookieJar = CookieJar::fromArray([
    'cookie_name' => 'cookie_value'
], 'example.com');

$client->request('GET', '/get', ['cookies' => $cookieJar]);

您可以阅读文档here。

【讨论】:

注意:cookie jar 的域必须与您请求的域匹配。 我正在从里到外阅读那部分文档,我找不到设置 cookie 的方法,它只提到了误导性的“cookie jar interface”....看起来像你的建议的文章。你可以把它的截图发给我们,因为我可以把它从来没有提到过的“cookies”部分的截图发给我们,否则我就不用谷歌了。 guzzle 最好的文档是源代码。 我尝试过使用 cookieJar,但出现 cookie 之类的错误必须是 GuzzleHttp\Cookie\CookieJarInterface 的实例【参考方案2】:

使用 Guzzle 向请求添加 cookie 的另一种方法:

$url = 'https://www.example.com';
$request_options = [
  'headers' => ['Cookie' => 'COOKIE_NAME=VALUE']
];
$response = $this->httpClient->request('GET', $url, $request_options);

【讨论】:

感谢这与饼干罐相比对我有用。【参考方案3】: 如果使用 cookie 请求选项得到指示,

Guzzle 可以为您维护 cookie 会话。发送请求时,cookie 选项必须设置为 GuzzleHttp\Cookie\CookieJarInterface 的实例。

// Use a specific cookie jar
$jar = new \GuzzleHttp\Cookie\CookieJar;
$r = $client->request('GET', 'http://httpbin.org/cookies', [
    'cookies' => $jar
]);

如果您想对所有请求使用共享 cookie jar,可以在客户端构造函数中将 cookie 设置为 true。

// Use a shared client cookie jar
$client = new \GuzzleHttp\Client(['cookies' => true]);
$r = $client->request('GET', 'http://httpbin.org/cookies');

检查完整的quickstart。

【讨论】:

是的,那部分文档没有说明如何设置自定义 cookie。【参考方案4】:

对于在 laravel 中使用 Guzzle Http 发送 cookie,您可以使用以下示例代码:

        //your address
        $address = "http://example.com/xyz";
        
        //your cookie
        $coockie = ['Cookie' => "Key=Value"];
        
        //your request
        $res = Http::withOptions([
            'headers' => $coockie
        ])->get($address);

【讨论】:

以上是关于如何使用 Guzzlehttp/guzzle 6 发送 Cookie?的主要内容,如果未能解决你的问题,请参考以下文章

安装 guzzlehttp/guzzle 时出现内存不足和未配置交换的问题

composer

将 Postman 请求转换为 guzzle 或其他 PHP HTTP 客户端

由于稳定性,Composer拒绝包

如何用php获取某个页面中的input的csrf

使用 composer 安装 Laravel 包的问题