关于请求二三事

关于请求二三事

请求的方式:

  1. get 请求,又有几种细分的方式:
  2. post 请求,细分方式:
  3. 表单请求(先不管分类依据是否正确)

下面分点来说:

  1. 会刷新页面的有:手动输入一个 URL 到地址栏,按回车;也可以是 FORM 表单提交的 GET 请求。不会刷新的:ajax(fetch)方式的 get(需要考虑跨域的问题)。一般来说,get 请求没有请求体,所有参数都在 url 中能看到,并且讲道理是有长度限制的(各个浏览器限制不一样,chrome 就可以好几大千字符,其他浏览器没测试)。在长请求地址时,考虑到兼容性,不要使用 get 的方式。使用 post。
  2. post 也可以 ajax(fetch),或者表单的 POST 方式(刷新页面)。对于获取数据渲染页面,使用异步获取。对于页面间传参可以使用 FORM 提交后刷新页面。长度任意。

关于请求要考虑的东西:

  1. 请求的 method,即是 GET、还是 POST(获取数据中常用到的请求主要是这两类),这关系到后台的数据解析方式;
  2. 请求体的编码问题。

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,会把空格变成 + 号,得注意。

注意好了编码的问题,让我们愉快的发送请求吧!