根据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 帐户,但我不知道他们最近多久修改了内容。