web常识和实际使用经验

1、接口被浏览器缓存,导致必须请求的接口没有请求,使得逻辑出错。

出现问题的情况是我们重定向到一个固定get类型的地址,发现有时接口会被调用,多半时候没有被调用,多此排查后端代码无果,只能怀疑到前端,查看浏览器重定向请求(chrom F12后勾选保存日志选项)后发现接口是调用了的,实在是百思不得其解,后来发现这个重定向有个from disk的说明,当时没注意,后来发现这就是从本地缓存拿结果的标致,要想禁止缓存,不可能要求所有用户设置F12后勾选禁止缓存,只能后端改造,后来发现可以在请求地址后面带一个时间戳的参数,这样浏览器认为是不同请求就会进行网络请求,而不是from disk。

2、URL和URI的区别

URI:uniform resource identifier 统一资源标识

URL:uniform resource locator 统一资源定位

URN:uniform resource name 统一资源名称

url是一个特殊的uri,url获取资源的描述,uri是资源标识,uri是个非常宽泛的概念,所以是个比较抽象的描述,类似万金油。

3、url为什么要编码?

a、

HTTP协议中定义了URL的书写规范,protocol用://分割,path用/分割,第一个参数前用?分割,第二个参数开始用&分割,如果请求方的参数中含有这些分割字符,那么服务方的解析程序无法按预期的方式解析,因为他不知道你的分隔符到底是不是参数的一部分。所以需要对特殊字符进行编码,目前提供的编码函数基本都统一了,会有一批豁免的字符不用编码,被编码的都是这批豁免的字符之外的,中文就在被编码的范畴内。

b、
知道为什么编码后,还需要知道谁在编码,谁在解码。一般而言浏览器会对发出的请求检查,发现不是ascii码,就会进行编码,这里我们就不深入讨论这点,因为不同浏览器工作方式都不一样,程序开发时不能依赖浏览器的URL编码机制,所以我们需要自己手动编码,对于Javascript而言,编码函数有三个,豁免字符分别如下:
encodeURI(82个):!#$&'()*+,/:;=?@-._~0-9a-zA-Z  // 不会编码 / &,所以可以对争端URL编码
encodeURIComponent(71个):!'()*-._~0-9a-zA-Z  // 会把 / ? &编码掉,所以不能对整段URL编码
escape(69个):*/@+-._0-9a-zA-Z // 编码字符更加广泛,如果有特殊要求

c、

服务端处理编码的方式也是需要我们知道的,以tomcat为例,容器是会自动为我们解码的,tomcat解码是以参数为单位的,所以如果你url中含有中文或特殊字符,是需要编码的。

d、

实际使用案例,前端请求接口参数是一段url,这个时候,前端的编码方式需要使用encodeURIComponent这个参数,因为你需要将& / ?这些字符也编码,这样服务端才能拿到这个参,然后解码出来。

Java中的URLEncoder会对 / &进行编码,所以这个函数不能对整个url编码,否则就无法识别了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章