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->request('/me/videos', array('page'=>1,'fields'=>'modified_time'), 'GET', true, array('If-Modified-Since' => '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”标头的主要内容,如果未能解决你的问题,请参考以下文章