当前位置: 首页 > 知识库问答 >
问题:

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

章心水
2023-03-14

我在Web服务器中有一个文件,每次访问它时我都会将其下载到我的应用程序中,因为文件内容可能会更改,但如果更改了,我只想下载该时间,这样才能节省带宽,幸运的是,这就是ETag和If None Match标题字段的用途。

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

>

  • 在下载该文件的后续请求中,我会附加If-Noo-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)")
    
    })
    

    这是回应

    响应:可选({URL:http://10.12.1.101/Etag/ringtone1.mp3}{状态代码:200,标头{“接受范围”=字节;连接=“保持活动状态”;“内容长度”=221552;“内容类型”=“音频/mpeg”;日期=“2016年2月24日星期三14:57:53 GMT”;Etag=“\”36170-52c1cc36d9b40\“”;“保持活动”=“timeout=5,max=100”;“上次修改时间”=“16年2月19日星期五10:15:33 GMT”,服务器=“Apache/2.4.16(Unix)PHP/5.5.29”;}})

    我在这里做错了什么?

  • 共有3个答案

    皇甫智明
    2023-03-14

    此问题是由于缓存策略'useStatcolCachePolicy'、'returCacheDataElseLoad'或'returCacheDataDontLoad'造成的。

    您可以使用上述任何其他策略。最好是“reloadIgnoringLocalAndRemoteCacheData”。

    龚寂弦
    2023-03-14

    缓存策略命名约定令人困惑,更好的是它实际上并没有实现其中一些...

    这篇文章很好地解释了它们。http://nshipster.com/nsurlcache/

    此外,如果您让缓存策略使用< code > UseProtocolCachePolicy ,那么您的NSURLSession将收到状态代码< code>200,并从缓存中生成响应。

    闻人哲茂
    2023-03-14

    我遇到了同样的问题。我发现这是因为缓存政策。您需要按如下方式进行设置:

    request.cachePolicy = .ReloadIgnoringLocalAndRemoteCacheData
    

    你会没事的

     类似资料:
    • 我想玩动作过滤器创建和实施ETag的动作过滤器,并使HomeController从mvc 4模板缓存10秒。 以下是我的属性: 这是HomeController: 它已编译并运行,但在Chrome开发工具网络中- 请求URL: http://: 1772/Home/关于请求方法: GET状态码: 200 OK请求Headersview源接受: text/html,应用程序/xhtml xml,应用

    • 问题内容: include(‘header.php’); 上面的代码不断给我重定向的问题。错误如下: 警告:无法修改标头信息-已在/ Applications / MAMP / htdocs / testygubbins / OO / test / form中发送的标头(输出始于/Applications/MAMP/htdocs/testygubbins/OO/test/header.php:15

    • 问题内容: 不知道为什么这不起作用。这是代码: 而不是重定向页面,此输出到网页。它跳过了重定向。为什么?我怎样才能解决这个问题?page1.php是一个实际页面,与当前页面位于同一文件夹中。上面的代码是php文件的第一行。没什么 没有。甚至没有空格。 问题答案: Pekka在评论中回答了我的问题。他没有发布答案,所以我现在是。标头重定向后使用此方法。由于某种原因,页眉的其余代码在header()方

    • 缓存-控制:私有内容-编码:gzip内容-长度:6544内容-类型:text/html;Charset=UTF-8日期:周二,2014年5月13日14:19:52格林威治时间ETAG:13.05.2014年17:01:02服务器:Microsoft-IIS/8.0变化:接受-编码X-ASPNET-版本:4.0.30319 X-ASPNETMVC-版本:4.0 x-Power-by:ASP.NET

    • 我的jwt身份验证有问题。 我试图从rest api获取模板列表,但是当我试图访问标题'Authorization'时,值为NULL。下面是我的代码: 前缀和令牌都设置好了,当我将它们记录在控制台中时,我可以看到它们。

    • 问题内容: 我正在将ng-table与动态列一起使用,使用http://bazalt-cms.com/ng- table/example/20中 的创建者示例 它工作得很好,直到我尝试使用transclude包裹指令之前,女巫导致标题消失,如http://plnkr.co/edit/mjYVEf所示。 index.html script.js 有人遇到过同样的问题吗? 问题答案: 为页眉定义模板,