前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >还在问post与get的区别?

还在问post与get的区别?

作者头像
Mandy的名字被占用了
发布2019-12-04 11:53:56
8080
发布2019-12-04 11:53:56
举报

解题思路:这道题已经属于不能再考的题目了,遇到这道题目。我们不能简单的解答,get如何,post如何。我们需要从两者的不同点、相同点、数据的传输方式、底层分析。

相同点:

  • 两者都是基于tcp协议进行传输数据的,都是http协议中的请求方法。

不同点:

  • 传输数据方式
    • get传递参数是通过url传递传输。例如 https://www.baidu.com?name=张三&age=12&sex=男,也可以使用https://www.baidu.com/name/张三/age/12/sex/男,是因为解析报文的过程是通过获取 TCP 数据,用正则等工具从数据中获取 Header 和 Body,从而提取参数,只要保证服务端能够正常解析数据即可。
    • post传递参数属于隐式传递参数(可以参考后面post传递参数四种格式)。由于各个浏览器或者各种框架技术原因,部分情况下post会发送两次tcp数据包,先发送 header,服务端返回 100 状态码再发送 body。
  • 数据传输大小
    • get方式提交数据的大小(一般来说1024字节),http协议并没有硬性限制,而是与浏览器、服务器、操作系统有关(为了性能和安全,服务器解析长url需要消耗较大的性能)。
    • post理论上来说没有大小限制,http协议规范也没有进行大小限制,但实际上post所能传递的数据量根据取决于服务器的设置和内存大小。
  • 数据安全
    • ge传递参数是通过浏览器的地址传递参数,是可以直接查看,安全系数低,因此不建议将一些重要的数据通过url传递。
    • post传递参数是通过隐私传递的,用户不是能直接查看,因此安全系统较高。
    • 其实两种数据传输方式都是属于明文传输,只不过get请求针对非英文的参数进行了url编码,post请求可以根据开发者的定义进行编码,如果要保证数据在传输过程中的安全性,可以使用https传输协议。
  • 请求类型
    • get是从服务器获取资源,属于获取型请求方式。
    • post是向服务端创建资源,属于创建型请求方式。
  • 历史记录
    • get的所有请求都会被记录在浏览器的访问记录里面,但可以通过设置浏览器,不记录。
    • post的所有请求不会被记录在浏览器的访问记录里面。
  • 重复操作
    • get请求是可以针对同一个url发送无限制次数的请求,不会对服务器端的数据造成实际的影响,如果后面的请求跟第一次的请求,内容没发生改变,返回的状态码是304(Not Modified)。
    • post请求是向服务器端发送创建性请求,因此会对服务器端的数据造成实际的影响,也就是所谓的重复提交。对于需要限制此类的请求,需要做防止重复提交的请求限制。
  • 书签操作
    • get请求是可以保存书签的。因为浏览器只可以对当前的url保存书签。
    • post请求是不可以保存书签的。

post传递参数的四种格式

post传递数据格式有四种方式,我们可以通过enctype来设置。这里所说的四种格式,是指的数据传输的编码方式。我们设置编码方式,在Content-type属性中设置即可。例如,设置为application/json的编码格式:

代码语言:javascript
复制
Content-Type: application/json;charset=utf-8

1.application/x-www-form-urlencoded编码方式: 该编码方式是post请求中默认编码方式,不指定编码方式,就默认采用该编码方式。提交的数据按照key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。大部分服务端语言都对这种方式有很好的支持。例如 PHP 中,$_POST['title'] 可以获取到 title 的值,$_POST['sub'] 可以得到 sub 数组。效果预览

代码语言:javascript
复制
POST http://www.example.com HTTP/1.1Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

2.multipart/form-data编码方式:只需要给表单的 enctype` 设置 multipart/form-data。

代码语言:javascript
复制
<form action="" enctype="multipart/form-data" method="post">用户名称: <input type="text" name="username">用户密码: <input type="password" name="password">文件选择: <input type="file" name="file"><input type="submit"></form>

效果预览

代码语言:javascript
复制
POST http://www.example.com HTTP/1.1Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="text"title------WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name="file"; filename="chrome.png"Content-Type: image/pngPNG ... content of chrome.png ...------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段标准中原生 表单也只支持这两种方式(通过 元素的 enctype 属性指定,默认为 application/x-www-form-urlencoded。其实 enctype 还支持 text/plain,不过用得非常少)。

3.application/json编码方式: 该编码方式是告诉服务器端消息主体是通过json序列化之后的数据格式。json数据格式是一种跨平台、跨语言、支持键值对复制的数据格式的数据序列化方式。除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。我们只需要给请求头设置如下格式即可:

代码语言:javascript
复制
Content-Type: application/json;
代码语言:javascript
复制
// jquery发送ajax请求示例    $(function(){        //请求参数        var list = {                name:  'bruce',                age:  12           };        $.ajax({            //请求方式            type : "POST",            //请求的媒体类型            contentType: "application/json;charset=UTF-8",            //请求地址            url : "http://127.0.0.1/admin/list/",            //数据,json字符串            data : JSON.stringify(list),            //请求成功            success : function(result) {                console.log(result);            },            //请求失败,包含具体的错误信息            error : function(e){                console.log(e.status);                console.log(e.responseText);            }        });    });

效果预览

代码语言:javascript
复制
POST http://www.example.com HTTP/1.1Content-Type: application/json;charset=utf-8{"name":"bruce","age":"12"}

4.text/xml编码方式: xml是一种可读性高,但臃肿并传输传输量大的一种数据格式。设置格式如下:

代码语言:javascript
复制
Content-Type: application/json;

效果预览

代码语言:javascript
复制
POST http://www.example.com HTTP/1.1Content-Type: text/xml<?xml version="1.0"?><methodCall><methodName>examples.getStateName</methodName><params><param><value><i4>41</i4></value></param></params></methodCall>

get数据传输格式

get请求中,虽然传递的参数是明文传输,但也是进行了部分编码处理的,并且只有一种格式, application/x-www-form-urlencoding。如下格式: 数据串联在url后面作为参数---->浏览器会对url中英文字母以外的字符进行URL encode(此时的编码方式因浏览器而定)---->发送给服务器时最终用iso-8859-1编码成二进制0,1来传输---->服务器对数据用iso-8859-1解码。

经常遇到中文乱码的原因也就在于第二步那里,我们并不知道浏览器的用哪种编码方式对字符进行了编码,而我们常见的解决方案就是把参数中文部分URLencode后再拼接到url后面,而编码方式一般设置为utf-8.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卡二条的技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • post传递参数的四种格式
  • get数据传输格式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档