标签: if-none-match

同时利用etags和chunked编码?

更新的问题

我的应用程序如何利用etags,并引入流/分块编码引入任何复杂性?


原始问题

在进行HTTP流式传输时Transfer-Encoding: chunked,Content-Length无法发送,因为它通常是未知的.

据我所知,当浏览器利用etags时,他们需要知道Content-Length.如果提供了etag但不提供Content-Length,则浏览器将永远不会发送If-None-Match.

有没有解决的办法?

etag http-content-length http-status-code-304 if-none-match

11
推荐指数
1
解决办法
790
查看次数

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

我的网络服务器中有一个文件,我每次访问它时都会将其下载到我的应用程序,因为它可能会更改文件内容但是如果它被更改我想下载那个时间只有这样才能保存带宽而且幸运的是那是什么此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"; …

etag ios nsurlsession if-none-match swift

10
推荐指数
1
解决办法
2998
查看次数

Android OkHttp如何处理ETag

我尝试使用OkHttp进行Android离线缓存方法.流程是这样的:

  1. 我在头字段if-none-catched向服务器发送一个带有ETag空字符串的HTTP请求,服务器返回一个正确的ETag.
  2. 然后我存储ETag并缓存响应.
  3. 下次当我触发相同的服务调用时,我得到相同的ETag并将其设置为HTTP请求标头,如果ETag相同,服务器将返回HTTP 304.

我现在的问题是如何存储和检索ETag?OkHttp默认会处理还是我需要在SQLite存储?我一直在谷歌上看OkHttp实现ETag示例代码,但我得到的只是普通的缓存方法.链接我参考:

  1. 我正在尝试使用Java的HttpURLConnection来执行"条件获取",但我从未获得304状态代码
  2. https://github.com/square/okhttp/wiki/Interceptors
  3. 在Android中为OkHttp设置缓存的正确方法
  4. https://gist.github.com/polbins/1c7f9303d2b7d169a3b1#file-restcontroller-java-L45

到目前为止,我所获得的只是第一次服务调用的缓存,但不再从服务器获取最新数据.感谢是否有人可以提供一些指导或找到任何处理ETag和if-none-catch动态的OkHttp分享的好例子.任何澄清都可以随意询问.

etag android okhttp if-none-match

8
推荐指数
1
解决办法
5276
查看次数

ETag 是否使 Cache-Control 标头无效?

我正在从 RESTful Web 服务中获取资源,并在响应中添加以下两个标头:

Cache-Control: public, max-age=120
ETag: "3D03F8066015A1438532E049AE5E16EA"
Run Code Online (Sandbox Code Playgroud)

浏览器第一次收到这个响应时,它正确地缓存了 2 分钟。

但是,下次我请求资源时,我的浏览器现在发送了一个IfNoneMatch标头,并按304 Not Modified预期获得了一个标头,以及另一个Cache-Control要缓存 2 分钟的标头。

但是浏览器没有缓存响应。我不断刷新页面,它不断提出请求,因此不断获得304 Not Modified.

这是正常行为吗?

我如何告诉浏览器在获得 2 分钟后重新验证其缓存资源304 Not Modified,并且不再发出任何请求?

etag caching http-headers http-status-code-304 if-none-match

5
推荐指数
0
解决办法
914
查看次数