Etag和if-None-Match

前言

最近在跟后台对接口时,发现请求同一个接口时总是一次成功一次失败这样间隔着来,很是困扰。请求失败的时候报的错时502 Not Modified,这个报错也是百思不得解。在我掌握的知识里502时服务器错误,而Not Modified对应的状态码应该时304,但这样的报错提示是从来没有遇到过。另外这个错误也只是在本地跑的时候会有,放到线上的环境就很正常,第二次请求时也是304而不会报错。得闲我比较了本地两次调接口时的请求头,发现第二次也就是请求失败的时候请求头多了一个字段If-None-Match,然后禁用了缓存,果然就不会有报错了,所以我猜想可能是后台没有对缓存做处理吧。然后我去查阅资料学习了下请求头ETagIf-Not-Match.

原理

它的原理是这样的,当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值(3f80f-1b6-3e1cb03b)并通过 ETag 返回给浏览器,浏览器把"3f80f-1b6-3e1cb03b" 和 A 同时缓存在本地,当下次再次向服务器请求A时,会通过类似 If-None-Match: "3f80f-1b6-3e1cb03b" 的请求头把ETag发送给服务器,服务器再次计算A的哈希值并和浏览器返回的值做比较,如果发现A发生了变化就把A返回给浏览器(200),如果发现A没有变化就给浏览器返回一个304未修改。这样通过控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客

你可能感兴趣的:(c#,移动开发,javascript,ViewUI)