使用 curl_setopt 设置标题

可以使用 curl_setopt 函数使用专用选项设置某些标头;使用选项设置标题的主要好处是某些事情将被自动处理,例如:解码使用 gzip 或者 brotli 压缩的内容。

使用 curl_setopt 还是 CURLOPT_HTTPHEADER 并不重要,但前者对于某些人来说可能更容易使用——有时我们甚至可能同时使用它们。

可以分别使用 CURLOPT_USERAGENT 和 CURLOPT_COOKIE 选项设置 User-agent 和 Cookie 标头;我们可能会发现这比手动添加标题更容易。

如果我们将 cookie 和用户代理字符串都存储在变量中,如下所示:

$User_Agent = 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31';
$cookies = 'CookieName1=Value;CookieName2=Value';

我们可以直接通过 curl_setopt 直接设置:

curl_setopt($ch, CURLOPT_USERAGENT, $User_Agent);
curl_setopt($ch, CURLOPT_COOKIE, $cookies);

与使用数组相比,这可能更容易,并且稍微降低了拼写错误的风险。

PHP 中使用cURL 自定义请求标头

在 PHP 中使用 cURL 时也可以定义自定义请求头;当我们想要更改用户代理字符串、包含引用标头以及在执行 HTTP 请求时想要支持 cookie 时,它们非常有用。

可以为所有 HTTP 请求类型定义自定义请求标头。
例如。

  • GET
  • POST
  • HEAD
  • PUT
  • DELETE
  • PATCH

在 PHP 中,我们可以使用 CURLOPT_HTTPHEADER 选项设置自定义请求标头 - 一旦启用此选项,我们可以通过将标头作为索引数组提供来包含自定义标头。

例子:

$request_headers = []; //Prepare a new array
$request_headers[] = 'user-agent: Just For Fun HTTP Client';
$request_headers[] = 'referer: https://onitroad.com/';
//Prepare the HTTP request
$ch = curl_init("https://onitroad.com/api/request-headers");
//Provide the request headers as an indexed array
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
//Performs the Request, with specified curl_setopt() options (if any).
$response_body = curl_exec($ch);

在某些情况下,这也可能被称为标题欺骗——尽管“欺骗”这个术语应该只用于描述伪造标题的行为。

使用 cURL 设置 cookie

当我们想在网站上使用 Cookie 时,我们需要将它们包含在 cURL 标头中;有几种方法可以添加请求头,一种是

cookie 字段包含一个站点的所有 cookie,因此如果有多个 cookie,它们应该用分号 (;) 分隔。

$cookies = 'CookieName1=Value;CookieName2=Value';
$request_headers[] = 'cookie: '. $cookies;

Cookie 名称必须是唯一的。

添加自定义请求标头

在 PHP 中使用 cURL 库时,CURLOPT_HTTPHEADER 选项与 curl_setopt 函数结合使用以添加自定义请求标头。
单个标题可以作为索引数组中的元素提供,该数组作为参数提供给 cul_setopt 函数。

这是一个完整的示例,展示了如何设置用户代理和接受请求标头:

//URL to fetch
$url = "https://onitroad.com/api/request-headers";
//Setting the HTTP Request Headers
$user_agent = 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31';
$request_headers = []; //Prepare a new array
$request_headers[] = 'user-agent: '. $user_agent;
$request_headers[] = 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
//Prepare the HTTP request
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
//Performs the Request, with specified curl_setopt() options (if any).
$response_body = curl_exec($ch);

$response_body 变量包含资源的下载内容,也称为“响应体”;我们可以尝试使用 echo 将其直接输出到浏览器 - 只需确保匹配资源的 MIME 类型(text/html)。

内容协商

请求头用于客户端和服务器之间的内容协商。

例如,Web 浏览器可以使用 accept-encoding 标头来通知服务器它更喜欢哪种编码;这通常是 gzip 或者 brotli 压缩,其中 brotli 提供最高的压缩。
当客户端在 HTTP 请求中包含标头时,它可能如下所示:

Accept-Encoding: gzip, deflate, br

在这种情况下,客户端通知服务器它支持 gzip、deflate 和 brotli (br)。

要使用 cURL 发送接受编码标头,我们可以使用 CURLOPT_ENCODING:

curl_setopt($ch, CURLOPT_ENCODING, "br, gzip");

另一个用于内容协商的请求头
,某些网站依赖的是接受语言标头;这可能用于请求 UI 或者网站内容的特定翻译:

Accept-Language: en-US,en;q=0.9,da;q=0.8

每种语言旁边的 q 称为相对质量因素,用于表示客户端的偏好,但这是非常不准确的,因为用户似乎很少更改他们的浏览器默认值。
要使用 cURL 发送接受语言,请使用以下命令:

$request_headers[] = 'accept-language: en-US,en;q=0.9';
curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);

我们不能使用专用选项发送所有标头,而是需要将 CURLOPT_HTTPHEADER 与包含要发送的标头的数组一起使用。
ENCODING 选项似乎也不支持 brotli 格式,因此我们可能需要手动解压缩 brotli 编码的响应。

日期:2020-06-02 22:17:34 来源:oir作者:oir