关于请求二三事
关于请求二三事
请求的方式:
- get 请求,又有几种细分的方式:
- post 请求,细分方式:
- 表单请求(先不管分类依据是否正确)
下面分点来说:
- 会刷新页面的有:手动输入一个 URL 到地址栏,按回车;也可以是 FORM 表单提交的 GET 请求。不会刷新的:ajax(fetch)方式的 get(需要考虑跨域的问题)。一般来说,get 请求没有请求体,所有参数都在 url 中能看到,并且讲道理是有长度限制的(各个浏览器限制不一样,chrome 就可以好几大千字符,其他浏览器没测试)。在长请求地址时,考虑到兼容性,不要使用 get 的方式。使用 post。
- post 也可以 ajax(fetch),或者表单的 POST 方式(刷新页面)。对于获取数据渲染页面,使用异步获取。对于页面间传参可以使用 FORM 提交后刷新页面。长度任意。
关于请求要考虑的东西:
- 请求的 method,即是 GET、还是 POST(获取数据中常用到的请求主要是这两类),这关系到后台的数据解析方式;
- 请求体的编码问题。
- 1 就不详细说了,只要知道 GET 一般是从 url 中获取数据,没有所谓的请求体(我使用 XMLHttpRequest 发请求,send 中加一个对象,在请求详情中并没有出现我发送的数据)。
- 对于 2,在发送请求时,不同浏览器、不同操作系统,在发送包含中文等非 ANSI 编码的文字时,会存在对 URL 的编码问题。具体可看 https://blog.csdn.net/liaozhongping/article/details/48543147 这里。大致就是说,最好对存在中文的查询手动进行一次 urlencode,以解决各浏览器编码不一致问题。
PS: 题外话,对于编码,js 提供了三种,escape, encodeURI, encodeURIComponent。区别见:https://www.cnblogs.com/qiantuwuliang/archive/2009/07/19/1526687.html 。简而言之,escape 针对 非
1 | 英文字母,数字,- _ . ! ~ * ' ( ) |
进行转码,encodeURI 在 escape 的基础上,增加了对 URI 敏感的
1 | ;/?:@&=+$,# |
,这几个字符不参与转码。encodeURIComponent 会转码 URI 敏感的那几个字符
1 | ;/?:@&=+$,# |
它相当于转码一个字符串,这个字符串是一个完整 URI 的某一部分,放在 URL 来说可以表达一个协议头或者某一级 path 或者是查询的参数等。
关于编码要考虑的
前端的编码正确与否,直接关系到后端的解码是否正确。比如,前端编码了两次,后端只解码了一次,能 correct 吗?当然不能。
首先需要知道的是
不管你的 URL 中有没有非 asic 字符,浏览器默认都会对 URL 进行编码一次,只是说,如果你的 URL 中只有 asic 字符了,比如:www.qunar.com,不管再怎么被浏览器转码都还是 www.qunar.com。所以说,在存在中文参数的,可以先 encodeURIComponent 一遍,再被浏览器自己转码一遍。发到后端的请求地址或者参数,会被后端正确地用一次解码或者两次解码来正确接收(视后端框架是否会主动解码一次 URL 地址,一般来说是会的)。
补充已知坑
java 中 URLEncode.encode,会把空格变成 + 号,得注意。
注意好了编码的问题,让我们愉快的发送请求吧!