当前位置: 首页 > 科技观察

用HTTP提交数据,基本就是这五种方式

时间:2023-03-20 21:33:55 科技观察

在web开发中,向服务器提交数据是一个基本的功能。工作中会用到很多xhr/fetchapi或者axios,里面封装了一层库。.可能大家写了很多跟http/https相关的代码,但是还没有整理出具体是哪几类呢?其实通过http/https向服务端传输数据基本有五种方式:urlparam、query、form-urlencoded、form-data、json。urlparamRestful规范允许在url中写入参数,例如:http://guang.zxg/person/1111其中1111是路径中的参数(urlparam),服务端框架的路由或者单页应用支持从url中提取参数。查询通过在?之后用&分隔的字符串传递数据在网址中。例如:http://guang.zxg/person?name=guang&age=20这里的姓名和年龄就是查询传递过来的数据。其中,非英文字符和一些特殊字符需要编码,可以使用encodeURLComponent的api处理,也可以使用封装了一层的qeury-string库。constqueryString=require('query-string');queryString.stringify({name:'light',age:20});//?name=%E5%85%89&age=20通过URL传递数据的方式是这样的2后三种是通过身体传输数据的方式。form-urlencoded就是这样直接用form表单提交数据的。它和querystring的区别是放在body中,然后content-type指定为application/x-www-form-urlencoded。因为它也是一个查询字符串,所以它也应该使用encodeURIComponentapi或查询字符串库进行处理。其实这样的设计也很好理解。get把数据做成一个querystring,放在url后面,所以在设计form的post提交方法的时候,直接把数据用同样的方式放在body里面。&分隔的form-urlencoded方法需要对内容进行url编码。如果传递的数据量很大,比如上传文件,不太适合,因为对文件进行一次编码太慢了。这时候就可以使用form-data了。form-data表单数据不再用&分隔数据,而是使用--------+一串数字作为分隔符。因为不是url的方式,自然不用再做urlencode了。form-data需要指定contenttype为multipart/form-data,然后指定boundary,也就是分界线。正文内部是由边界分界线划分的内容。显然,这种方式适合传输文件,可以传输多个文件。但是边界毕竟多了,只是用来分隔的,所以requestbody就变多了。jsonform-urlencoded需要对content做urlencode,而formdata需要加长边界,这两种方式都有一些缺点。如果只是传输json数据,这两个就不用了。可以直接指定contenttype为application/json:我们一般用这个来传输json数据。这三种是通过body传递数据的方式。综上所述,向服务器传输数据是web开发中的一项基本功能。常用的方法有五种:urlparam、query、formurlencoded、formdata、json。前两种是通过url传输数据的方式(数据需要经过url编码),后三种是通过body传输数据的方式。formurlencoded只是把query放在body里,还需要对数据进行url编码,所以不适合处理文件。(内容类型指定为application/x-www-form-urlencoded)表单数据通过边界分隔内容,不需要做urlencode,非常适合传输文件。但是如果你不是传输文件,就没有必要使用它,因为一些更多的边界字符串会占用更多的空间。(内容类型要指定为multipart/form-data)JSON是现在最常用的数据传输方式,既不需要url编码也不需要不必要的边界。(将内容类型指定为application/json)。当然你也可以指定其他的内容类型,比如application/xml、text/plain等,但是一般不会用到。99%的情况下,我们都是通过这5种提交数据的http/https方式与服务器进行交互的。