Как использовать ETags в YouTube API

По-видимому, мы можем использовать ETags, чтобы узнать, был ли обновлен канал/плейлист, основываясь на следующем заявлении из их документация:

когда ваше приложение снова запрашивает сохраненный ресурс, оно указывает ETag, связанный с этим ресурсом. Если ресурс был изменен, API возвращает измененный ресурс и ETag, связанный с этой версией ресурса. Если ресурс не изменился, API возвращает ответ HTTP 304 (не изменен), который указывает, что ресурс не изменился.

Но я попытался получить данные канала, которые не меняются, но после нескольких обновлений кажется, что ETag переходит к другим значениям!


person user385729    schedule 17.06.2015    source источник
comment
Покажите нам свой код, с которым вы это тестируете.   -  person idbehold    schedule 17.06.2015
comment
@idbehold Я просто вызываю конечную точку прямо в своем браузере!   -  person user385729    schedule 17.06.2015
comment
И что конечная точка?   -  person idbehold    schedule 17.06.2015
comment
Это и есть конечная точка, но с правильным ключом вместо XXX googleapis.com/youtube/v3/   -  person user385729    schedule 17.06.2015
comment
Похоже, вы получите 304 ответа, если удалите &order=date в конце строки запроса.   -  person idbehold    schedule 17.06.2015
comment
Вы уверены, что ничего не изменилось? Может быть, у вас появился новый подписчик или что-то в этом роде.   -  person JAL    schedule 17.06.2015
comment
@JAL Забавно, что случайные прыжки между двумя числами   -  person user385729    schedule 17.06.2015
comment
@idbehold Но видите ли вы случайные переходы etag между двумя разными числами?   -  person user385729    schedule 17.06.2015


Ответы (1)


Вы не можете просто снова нажать на конечную точку и сравнить значения etag; скорее, вы должны сделать запрос, сохранить значение etag, а затем передать это значение etag с последующими запросами. Вы сделаете это в заголовке запроса... установите для заголовка HTTP «If-None-Match» значение вашего etag. Если ничего не изменилось, вы получите 304 (вместо любого контента или метаданных). Если что-то изменилось, вы получите новый результат, и вы возьмете этот новый etag и сохраните его вместо старого.

Клиент API Google для Javascript поддерживает этот заголовок; когда вы создаете свой объект gapi.client.request, вы передаете объект в качестве аргументов; один из параметров этого объекта — «заголовки», в котором вы можете установить «If-None-Match» равным etag, который вы хотите проверить.

(Также обратите внимание, что есть заголовок «If-Match», который также может работать с etags, где он будет возвращать контент только в том случае, если ресурс является ТАКИМ ЖЕ ТАКИМ, который вы запрашивали ранее ... вероятно, не так много варианты использования для этого, но он существует и поддерживается.)

person jlmcdonald    schedule 17.06.2015
comment
Большое спасибо за разъяснение! Но я считаю, что etag не должен случайным образом переключаться между двумя числами! Вам не кажется, что это ошибка API YouTube? If-None-Match делает именно то, что делаю я, но более эффективным способом, который не показывает результат, если результат не был изменен, но все же использует etag, который случайным образом переключается между двумя числами независимо от того, были ли изменены данные. или не... - person user385729; 18.06.2015
comment
Тег etag просто представляет состояние запроса; нет ничего, что говорило бы о том, что несколько тегов не могут представлять одно и то же состояние. Но если данное состояние изменится, то любые etags, представляющие это состояние, станут недействительными. (Что касается того, почему они могут использовать несколько etags для одного и того же состояния, я могу только догадываться... это может быть связано с производительностью, например, с разными серверами кэширования. Или что-то совсем другое.) - person jlmcdonald; 18.06.2015