3

根据Vimeo API 文档

If-Modified-Since标头使您能够仅返回自特定日期和时间以来已修改的那些 API 资源。

标题如下所示: If-Modified-Since: {ddd}, {D} {MMM} {YYYY} {HH}:{mm}:{ss} {Z} 注意:如果您的格式代码生锈,则以格林威治标准时间 2023 年 6 月 20 日星期二 14:42:36 为例。

如果自此日期以来没有任何资源被修改,API 将返回空响应正文和 HTTP 状态 304 Not Modified。


我正在为 Vimeo API 使用官方 PHP 库
根据GitHub 问题 #130,PHP 库的request()方法接受一组标头。这个提交显示了$headers数组是如何传递和解析的:

public function request($url, $params = array(), $method = 'GET',
                        $json_body = true, array $headers = array())
// Set the headers
foreach ($headers as $key => $value) {
  $curl_opts[CURLOPT_HTTPHEADER][] = sprintf('%s: %s', $key, $value);
}


但是当我通过示例中显示的未来日期时,我仍然收到完整的视频列表,而不是文档中指定的“空响应正文和 HTTP 状态 304 未修改”。

我究竟做错了什么?

$fields = array(
  'created_time',
  'modified_time'
);

$params = array(
  'page' => $page,
  'filter' => 'embeddable',
  'filter_embeddable' => true,
  'fields' => implode(',',$fields)
);

$headers = array(
  'If-Modified-Since' => 'Tue, 20 Jun 2023 14:42:36 GMT'
);

$json_body = true;
$method = 'GET';

$response = $vimeo->request('/me/videos', $params, $method, $json_body, $headers);

结果:

Array
(
    [0] => Array
        (
            [created_time] => 2018-06-05T19:27:18+00:00
            [modified_time] => 2018-06-29T19:12:21+00:00
        )

    [1] => Array
        (
            [created_time] => 2016-06-02T03:01:40+00:00
            [modified_time] => 2019-04-30T06:15:29+00:00
        )

    [2] => Array
        (
            [created_time] => 2016-05-29T05:31:46+00:00
            [modified_time] => 2019-04-25T07:46:53+00:00
        )

    ....

编辑

根据这个答案(不是关于 Vimeo),如果在“If-Modified-Since”日期之后修改了其中一个视频,API 似乎可能会返回整个视频集。

如果整个响应中有任何变化,那么它会将整个响应发送给您。

但如果日期在未来,我仍然希望结果为空。我是不是误会了?


编辑

Tom 建议 Vimeo API 忽略将来设置的“If-Modified-Since”标头。我最近尝试设置我的,但我仍然得到在该日期之前修改的结果:

$vimeo = new \Vimeo\Vimeo(false,false,$access_token);

$fields = array(
    'modified_time'
);

$params = array(
    'page' => 1,
    'fields' => implode(',',$fields)
);

$method = 'GET';
$json_body = true;

$headers = array(
    'If-Modified-Since' => 'Fri, 24 May 2019 14:42:36 GMT'
);

$response = $vimeo->request('/me/videos', $params, $method, $json_body, $headers);

echo"<pre>".print_r($response,true)."</pre>";

结果包括:

[21] => Array
  (
    [modified_time] => 2019-05-16T17:22:58+00:00
  )

[22] => Array
  (
    [modified_time] => 2019-05-12T08:07:30+00:00
  )

编辑

我错了。如上所述,我相信如果响应中的任何项目自“If-Modified-Since”时间戳以来已被修改,则会返回整个响应。这使它看起来像标题不工作。但是我将时间戳设置为尽可能接近当前时间,并且确实得到了“304 Not Modified”响应,正如汤姆在下面的回答中所报告的那样。其他人(内容制作者)也可以访问我正在测试的 Vimeo 帐户,但我不知道他们最近多久修改了内容。

4

1 回答 1

1

Vimeo 没有记录,但我通过实验发现:

If-Modified-Since谎言在未来时,它被忽略。

否则,标题按预期工作。但是请注意您的时区和可能的几秒钟的时钟偏差。

Vimeo 的修改时间显示在 API 响应中,在我的例子中:

"modified_time": "2019-05-22T09:52:45+00:00",

If-Modified-Since: Wed, 22 May 2019 09:56:25 GMT为我的情况返回一个304 Not Modified


我已向 Vimeo 提交支持请求以澄清或更改此行为。

于 2019-05-22T09:59:48.773 回答