ETag和If-None-Match HTTP标头不起作用

Dur*_*n.H 10 etag ios nsurlsession if-none-match swift

我的网络服务器中有一个文件,我每次访问它时都会将其下载到我的应用程序,因为它可能会更改文件内容但是如果它被更改我想下载那个时间只有这样才能保存带宽而且幸运的是那是什么此ETagIf-None-Match 标头字段用于.

  • 当我第一次发出请求时,我从HTTP响应头中检索ETag

第一次请求文件

  • 在随后的下载该文件的请求中,我附加了If-None-Match头域Etag值,这样如果没有变化那么我会得到HTTP响应状态码304,否则如果有的话我会得到200更改文件.

    第二次请求相同的文件

注意:

当我在Chrome 中使用高级REST客户端应用程序尝试上述步骤时,它应该可以正常工作但是当我在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)")

})
Run Code Online (Sandbox Code Playgroud)

这是回复

响应:可选({URL:http : //10.12.1.101/Etag/ringtone1.mp3 } {状态代码:200,headers {"Accept-Ranges"= bytes; Connection ="Keep-Alive";"Content-Length" = 221552;"Content-Type"="audio/mpeg"; Date ="Wed,2016年2月24日14:57:53 GMT"; Etag ="\"36170-52c1cc36d9b40 \"";"Keep-Alive"=" timeout = 5,max = 100";"Last-Modified"="Fri,2016年2月19日10:15:33 GMT"; Server ="Apache/2.4.16(Unix)PHP/5.5.29";}})

我在这做错了什么?

And*_* M. 11

我遇到了同样的问题.我发现这是因为cachePolicy.您需要将其设置如下:

request.cachePolicy = .ReloadIgnoringLocalAndRemoteCacheData
Run Code Online (Sandbox Code Playgroud)

你会没事的