2016-02-24 5 views
5

У меня есть файл в моем веб-сервере, и я загружаю его в свое приложение каждый раз, когда я обращаюсь к нему, потому что его возможное изменение содержимого файла может быть изменено. Но если оно изменено Я хотел бы загрузить это время только для того, чтобы сохранить пропускную способность и, к счастью, вот что это ETag и If-None-Matchполя заголовка для.HTTP-заголовки ETag и If-None-Match не работают

  • Когда я делаю запрос в первый раз, я извлечь ETag из заголовков ответа HTTP

First time request to the file

  • В последующих запросах, чтобы скачать этот файл я приложите Etag значение для If-None-Match headerfield, чтобы при отсутствии изменений то я получаю код ответа HTTP-ответа 304, иначе я бы получил 200, если есть изменение в файле.

    Second time request for same file

Примечание:

При попытке вышеуказанные шаги в Advanced REST Client Application в хроме работает хорошо, как это должно быть, но когда я пытаюсь что в iOS Я всегда получаю код ответа 200, но он должен был дать мне 304 для последующих запросов.

Вот пример кода я использую

var request1 = NSMutableURLRequest(URL:NSURL(string: "http://10.12.1.101/Etag/ringtone1.mp3")!) 
let Etagvalue="\"36170-52c1cc36d9b40\"" 
var session1 = NSURLSession.sharedSession() 
request1.HTTPMethod = "GET" 
var err: NSError? 
request1.addValue(Etagvalue, forHTTPHeaderField: "If-None-Match") 

var task = session1.dataTaskWithRequest(request1, completionHandler: {data, response, error -> Void in 
     print("response: \(response)") 

}) 

Вот ответ

Ответ: Необязательно ({URL: http://10.12.1.101/Etag/ringtone1.mp3} {код состояния: 200, заголовки { «Accept- Диапазоны "= байты Соединение =" Keep-Alive "; " Content-Length "= 221552; " Content-Type "=" audio/mpeg "; Дата =" ср, 24 фев 2016 14:57:53 ВРЕМЯ ПО ГРИНВИЧУ"; Etag = "\" 36170-52c1cc36d9b40 \ ""; «Keep-Alive» = «timeout = 5, max = 100»; "Last-Modified" = "Пт, 19 февраля 2016 10:15:33 GMT"; Сервер = "Apache/2.4.16 (Unix) PHP/5.5.29"; }})

Что я здесь делаю неправильно?

+1

показать нам запрос. например используя прокси-сервер (например, charles) –

+0

@ Daij-Djan - Внезапно он начал работать! Я не мог догадаться, почему эта непоследовательность! –

+0

@ Daij-Djan - есть ли зависимость для работы E-тега, отличная от конфигурации на стороне сервера? Мои пальцы все еще пересекаются, как он начал работать? –

ответ

5

Я столкнулся с той же проблемой. Я обнаружил, что это из-за cachePolicy. Вы должны установить его следующим образом:

request.cachePolicy = .ReloadIgnoringLocalAndRemoteCacheData 

И будет хорошо

+0

Это должно быть отмечено как ответ. Блестящий улов! –

+0

@KonstantinLoginov благодарит брата! –

+0

Это сработало для меня. Не могли бы вы отметить это как решение? – Naknut

0

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

Эта статья объясняет их хорошо. http://nshipster.com/nsurlcache/

Кроме того, если вы позволите политике кэша использовать UseProtocolCachePolicy, то ваш NSURLSession получит код состояния 200 с ответом, генерируемым из кеша.