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

时间:2019-05-02 19:32:20

标签: php vimeo-api if-modified-since

根据Vimeo API documentation

  

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

     

标题看起来像这样:   If-Modified-Since: {ddd}, {D} {MMM} {YYYY} {HH}:{mm}:{ss} {Z}   注意:如果您的格式代码不完整,请以2023年6月20日星期二14:42:36 GMT为例。

     

如果自该日期以来没有任何资源被修改,则API返回一个空的响应主体,并且HTTP状态为304未修改。


我正在使用Official PHP library for the Vimeo API
根据{{​​3}},PHP库的request()方法接受标头数组。 GitHub issue #130展示了$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 commit(与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”响应,如Tom在下面的回答中报告的那样。其他(内容生产者)也可以访问我正在测试的Vimeo帐户,但我不知道他们最近是如何修改内容的。

1 个答案:

答案 0 :(得分:1)

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

将来If-Modified-Since时,它会被忽略。

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

在我的情况下,API响应中显示了Vimeo的修改时间:

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

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


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