Vimeo API 未响应“If-Modified-Since”标头

Posted

技术标签:

【中文标题】Vimeo API 未响应“If-Modified-Since”标头【英文标题】:Vimeo API not responding to "If-Modified-Since" header 【发布时间】:2019-09-21 08:49:52 【问题描述】:

根据Vimeo API documentation:

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。

我正在使用Official php library for the Vimeo API。 根据GitHub issue #130,PHP 库的request() 方法接受一个标头数组。而this commit 展示了$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
        )

    ....

编辑

基于this answer(不是关于 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 帐户,但我不知道他们最近多久修改了内容。

【问题讨论】:

【参考方案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 提交支持请求,以澄清或更改此行为。

【讨论】:

感谢您的回复!这是有道理的,但我仍然会在我的If-Modifed-Since 日期之前得到结果,即使它是在过去设置的。我打电话给$response = $vimeo-&gt;request('/me/videos', array('page'=&gt;1,'fields'=&gt;'modified_time'), 'GET', true, array('If-Modified-Since' =&gt; 'Fri, 24 May 2019 14:42:36 GMT'));,其中一个结果显示“[modified_time] => 2019-05-12T08:07:30+00:00”。 我错了。正如我的问题中提到的,我相信如果响应中的任何项目自“If-Modified-Since”时间戳以来已被修改,则会返回整个响应。这使它看起来像标题不工作。但是我将时间戳设置为尽可能接近当前时间,并且确实收到了“304 Not Modified”响应,正如您所报告的那样。其他人(内容制作者)也可以访问我正在测试的 Vimeo 帐户,但我不知道他们最近多久修改了内容。感谢您的帮助!

以上是关于Vimeo API 未响应“If-Modified-Since”标头的主要内容,如果未能解决你的问题,请参考以下文章

Vimeo complete_uri 字段没有得到响应

Vimeo API - 控制台错误

从 vimeo 获取视频缩略图

html 响应Vimeo,Youtube视频

html Boostrap响应Vimeo视频

css 使用CSS响应YouTube和Vimeo视频