2016-02-24 1 views
5

J'ai un fichier dans mon serveur web et je le télécharge dans mon application chaque fois que j'y accède car il est possible que le contenu du fichier soit modifié Mais s'il est modifié Je voudrais télécharger ce temps seulement si la bande passante peut être sauvée et heureusement c'est ce que ce ETag et Si-Aucun-Matchles champs d'en-tête sont pour.ETag et If-None-Match Les en-têtes HTTP ne fonctionnent pas

  • Quand je fais une demande première fois, je récupère le ETag des en-têtes de réponse HTTP

First time request to the file

  • Dans les requêtes suivantes pour télécharger ce fichier que je attachez la valeur Etag pour si-aucun-match en-tête de sorte que s'il n'y a aucun changement alors j'obtiendrais le code d'état de réponse de HTTP 304 ou bien j'obtiendrais 200 s'il y a un changement dans le dossier.

    Second time request for same file

Note:

Lorsque je tente les étapes ci-dessus dans avancée REST application client en chrome, il fonctionne très bien comme il est censé être, mais lorsque je tente que iOS Je reçois toujours le code de réponse 200 mais il aurait dû me donner 304 pour les demandes suivantes.

Voici l'exemple de code que j'utilise

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)") 

}) 

Voici la réponse

réponse: en option ({URL: http://10.12.1.101/Etag/ringtone1.mp3} {code d'état: 200, en-têtes { « Accept Gammes "= octets; Connexion =" Keep-Alive "; " Content-Length "= 221552; " Content-Type "=" audio/mpeg "; Date =" Mer, 24 Feb 2016 14:57:53 GMT"; Etag = "\" 36170-52c1cc36d9b40 \ ""; "Keep-Alive" = "timeout = 5, max = 100"; "Last-Modified" = "Ven, 19 Fév 2016 10:15:33 GMT"; Serveur = "Apache/2.4.16 (Unix) PHP/5.5.29"; }})

Qu'est-ce que je fais mal ici?

+1

montrez-nous la demande générée. par exemple. en utilisant un serveur proxy (par exemple charles) –

+0

@ Daij-Djan - Tout à coup, il a commencé à travailler! Je ne pouvais pas deviner pourquoi cette incohérence! –

+0

@ Daij-Djan - Existe-t-il une dépendance pour E-tag à travailler autre que la configuration côté serveur? Mes doigts sont toujours croisés comment ça a commencé à fonctionner? –

Répondre

5

J'ai rencontré le même problème. J'ai découvert que c'est à cause de cachePolicy. Vous devez définir comme suit:

request.cachePolicy = .ReloadIgnoringLocalAndRemoteCacheData 

Et vous serez OK

+0

Cela devrait être marqué comme une réponse. Capture brillante! –

+0

@KonstantinLoginov merci mon frère! –

+0

Cela a fonctionné pour moi. Pourriez-vous marquer cela comme la solution? – Naknut

0

CachePolicy convention de nommage est source de confusion et mieux encore, il ne fait pas de mettre en œuvre certains d'entre eux ...

Cet article les explique bien. En outre, si vous laissez la politique de cache utiliser UseProtocolCachePolicy, votre NSURLSession recevra le code de statut 200 avec la réponse générée à partir du cache.