2016-12-06 12 views
10

Я пытаюсь включить поддержку eTag в своем приложении. Я использую Alamofire 4 в своем стремительном проекте 3.Поддержка eTag с использованием Alamofire 4

Кажется, что Etag прозрачно обрабатывается URLRequest, который использует Alamofire:

NSURLCache and ETags

Но это не работает.

Вот заголовок HTTP посланный веб-сервера:

headers { 
    Connection = "keep-alive"; 
    "Content-Length" = 47152; 
    "Content-Type" = "application/json"; 
    Date = "Tue, 06 Dec 2016 22:43:18 GMT"; 
    Etag = "\"ecf38288be2f23f6710cafeb1f344b8c\""; 
} }) 

У йо есть какие-либо намек?

Большое спасибо.

+0

Определить «Это не работает» – Lefteris

ответ

4

По умолчанию кеширование включено. Если вы регистрируете HTTP-трафик внутри своего приложения, на этот раз вы можете увидеть кешированные ответы, без запросов приложений на сервер.

В случае, если URLSession решает вернуть кэш-ответ вместо перехода на сервер, вы увидите тот же самый Date HTTP-заголовок ответа.

Чтобы обеспечить кэширование, вы должны проверять сетевые пакеты между вашим приложением и сервером.

+0

Я просто посмотрел на [это] (https://docs-assets.developer.apple.com/published/d24b133ea3/http_caching_2x_820a949f-9d5d-4a85-9ca2-50b42b339e18.png) изображение из [здесь] (https://developer.apple.com/documentation/foundation/nsurlrequest.cachepolicy). Похоже, что для этого клиент должен автоматически выполнить быстрый запрос 'HEAD'. Мой вопрос в том, что произойдет, если ваш сервер не будет маршрутизировать/выполнять запросы 'HEAD'? Означает ли это, что это не сработает вообще и в основном каждый раз, когда вы действительно будете делать запросы 'GET' - независимо от установки cachePolicy:' NSURLRequestUseProtocolCachePolicy'? – Honey

+0

@ Хоть на вашем изображении, есть путь, где HEAD не требуется. – paiv

+0

... пока ответ не будет устаревшим. Только когда он устареет, HEAD будет выпущен. Если сервер не обрабатывает HEAD, ресурс будет отмечен как измененный. Вы должны отлаживать это, фиксируя HTTP-пакеты, чтобы быть уверенными. – paiv

-1

У меня была та же проблема.

Вместо отправки \"ecf38288be2f23f6710cafeb1f344b8c\" обратно на сервер

отправить "ecf38288be2f23f6710cafeb1f344b8c"

0

Это политика кэширования по умолчанию при использовании URLRequest.

Если вы хотите изменить это поведение и увидеть «реальный» ответ от сети, так что вы можете справиться с Etag и StatusCode самого, вам просто нужно изменить политику кэширования reloadIgnoringCacheData:

var exampleRequest = try! URLRequest(url: route, method: .post, headers: headers) 
// This is the important line. 
exampleRequest?.cachePolicy = .reloadIgnoringCacheData 

Надеюсь, это поможет кому-то!

+0

как вы можете изменить * поведение? Разве вы не предлагаете полностью игнорировать кеш? И просто скачайте, что бы ни случилось ?! – Honey

+0

Я думаю, что это зависит от вашего варианта использования. Если ваш бэкэнд (или, в общем, API, который вы звоните), всегда отвечает на 200 с полным ответом, то я согласен с вами в том, что вам нужно продолжать кешировать. Но если ваш бэкэнд реализовал HTTP-Conditional-Get (чтобы он ответил 200 с полным телом, если были какие-либо изменения и * 304 * с пустым телом, если их не было), как и в моем случае, и вам нужно для доступа к реальному статусу кода ответа (потому что в этом случае вам нужно выполнить некоторые конкретные действия), вам нужно изменить кеш-политику URLRequest. –

 Смежные вопросы

  • Нет связанных вопросов^_^