Bug描述: 电商网站, 产品列表页面,加入购物车按钮,当连续点击“加入购物车”按钮时,在MAC上的Safari上,只会有部分请求通过 Ajax 被发送出去,而在 Chrome/IE/Firefox 上是没有这个问题的(每点击一次就发送一次请求)。

分析: 首先怀疑是浏览器兼容的问题, 因为其他浏览器上都是没问题的, 但是这个功能是由 jQuery.ajax 实现的, 对于jQuery来说, 这么明显的缺陷是不会出现的, 所以这种可能排除;
既然不是兼容问题, 那么最有可能就是我的jQuery.ajax请求写的有问题, 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
$.ajax({
    url: 'http://www.mydomain.com/checkout/cart/ajaxAdd',
    data: {product: product, form_key: form_key, qty: qty},
    complete: function (xhr, event) {
        var response = JSON.parse(xhr.responseText);

if(response.status){
            //TODO something when success
        }else{
            //TODO something when failure
        }
    }
});

看起来没有显示声明 async: true, 添加上之后Bug没有改善

后来突然灵光一现, GET 是从服务端上获取数据, POST 是向服务端发送数据, 虽然 GET 请求也可以传参,但是 GET 本质上是为了获取数据,会不会是 Safari 上的 GET 比较特殊,当上一次请求未完成时会忽略后面相同的请求? 添加上 type: ‘POST’后, 刷新页面, 果然问题解决了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$.ajax({
    type: 'POST',
    async: true,
    url: 'http://www.mydomain.com/checkout/cart/ajaxAdd',
    data: {product: product, form_key: form_key, qty: qty},
    complete: function (xhr, event) {
        var response = JSON.parse(xhr.responseText);

if(response.status){
            //TODO something when success
        }else{
            //TODO something when failure
        }
    }
});

有关 GET 和 POST 的区别网上说的很多了, 比如 GET 请求的参数是直接编码在 URL 里的, 而 POST 请求的参数经过编码后保存在报文主体里; GET 请求传输数据量大小有限而 POST 请求传输数据量无限, 等等, 以上都是各种浏览器或者客户端对 HTTP 协议中的 GET 和 POST 的实现, 其实都不是 GET 和 POST 的本质区别,HTTP 协议中规定的 GET 和 POST 的区别很简单, 就是 “GET 是从服务端上获取数据, POST 是向服务端发送数据”。

如果您觉得阅读本文对您有帮助,欢迎转载本文,但是转载文章之后必须在文章页面明显位置保留此段声明,否则保留追究法律责任的权利。

作  者:www.jpdou.top

原文链接:http://www.jpdou.top/an-experience-of-debug-about-get-and-post/

记一次有关GET/POST请求的Debug经历的更多相关文章

  1. 记一次 CORS 跨域请求出现 OPTIONS 请求的问题及解决方法

    今天前后端在联调接口的时候,发生了跨域请求资源获取不到的问题. 首先说明下跨域问题的由来.引自HTTP 访问控制 的一段话: 当 Web 资源请求由其它域名或端口提供的资源时,会发起跨域 HTTP 请 ...

  2. 记一次线上SpringCloud-Feign请求服务超时异常排查

    由于近期线上单量暴涨,第三方反馈部分工单业务存在查询处理失败现象,经排查是当前系统通过FeignClient调用下游系统出现部分超时失败(异常代码贴在下方). Caused by: feign.Ret ...

  3. 记一次vue 普通异步请求微信二进制二维码 乱码 问题解决然后渲染

    后端压力大,前端分忧. /*用微信小程序token拿二维码*/ async fetchMINIQRcode({commit,state},params){ var instance = axios.c ...

  4. 记一次nginx -t非常慢的排障经历

    在一次修改nginx配置时候,执行 case: #/usr/local/nginx/sbin/nginx -t 出现执行命令出现很久没返回结果,也没返回成功或是失败,就是一直卡住的状态,严重影响ngi ...

  5. PartyLocation的Post请求问题---debug

    这里,遇到了一个debug: @Override public void setPrimaryPartyLocation(PartyLocation partyLocation) { if (!get ...

  6. 【Ansible】记一次技术博客害死人的经历——ansible模板变量注入探究

    风和日丽,夏天的北京湿热并举,睁不开的眼睛里,横竖都看着是“吃人”. 带薪学习的日子不好过,要在几天内迅速掌握导师下发要求学习的技能,看着以前一起蹲IT坑的同事人来人往,用隔壁同性黄同学的话来说,就是 ...

  7. Eclipse设置断点无效、无法拦截请求进行Debug调试

    场景: 在Eclipse中添加Debug断点,从后台页面中点击修改按钮提交数据,发现打断点的地方并没有拦截到请求,接下来对此情况的进行分析. 分析: * 如果页面是根据业务需求复制别的相似html页面 ...

  8. 记一次Linux服务器上查杀木马经历

    开篇前言 Linux服务器一直给我们的印象是安全.稳定.可靠,性能卓越.由于一来Linux本身的安全机制,Linux上的病毒.木马较少,二则由于宣称Linux是最安全的操作系统,导致很多人对Linux ...

  9. 记一次在StackOverFlow上问问题的经历

    最近一直在做测试方面的事情,被测的一些功能需要连接到FTP服务器上.而我在做本地测试时为了方便,就使用java写了一个简单的ftp服务器,可以在命令行下直接启动运行. 当时在main函数里是这样写的. ...

随机推荐

  1. ubuntu安装wget

    ubuntu安装wget apt-get update apt-get install wget wget --version

  2. spring 4.0 JUnit简单的Controller测试

    比Dao和Service的测试稍微复杂一点.还是先写一个BasicWebTest用来总体配置: @WebAppConfiguration @ContextConfiguration(locations ...

  3. TCP/IP四层体系结构

    1.数据链路层  2.网络层  3.传输层  4.应用层 , 其中IP是在第二层网络层中,TCP是在第3层传输层中, Internet体系结构最重要的是TCP/IP协议,是实现互联网络连接性和互操作性 ...

  4. jquery选择器中的find和空格,children和>的区别、及父节点兄弟节点,还有判断是否存在的写法

     一.find和空格,children和>及其它的区别   空格:$('parent childchild')表示获取parent下的所有的childchild节点(所有的子孙). 等效成  = ...

  5. 10.Ubuntu16搭建蜜罐Cowrie

    一直都想尝试搭建一个蜜罐,因为蜜罐是一款可以对ssh,telnet,http等等协议攻击进行记录,对于输入命令和上传文件均有记录的一款软件. 记录可以设置在日志文件中或者通过配置数据库,导入数据库中方 ...

  6. 2.XML实体注入漏洞攻与防

    XML实体注入基础 当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件.执行系统命令.探测内网端口.攻击内网网站等危害. 简单了解XML以后,我们知道要在XML中使用特殊字符,需要使用实体字符 ...

  7. .NET Core 3.0 可回收程序集加载上下文

    一.前世今生 .NET诞生以来,程序集的动态加载和卸载都是一个Hack的技术,之前的NetFx都是使用AppDomain的方式去加载程序集,然而AppDomain并没有提供直接卸载一个程序集的API, ...

  8. mysql失效的几种情况

    1.如果查询条件中有or,即使查询的条件中带有索引也会失效,如果想使用or,又不想让索引失效,只能将or条件中的所有列都加上索引 2.like 查询一%开头用不上索引, 3.隐式转换会使索引失效 比如 ...

  9. C++基础之继承类和派生类

    (1)继承是创建一个具有某个类的属性和行为的新类的能力.原有的类称为基类,新创建的类称为派生类.派生类将基类中的所有成员作为自己的成员,同时派生类本身可以定义新的成员(2)派生类只有一个基类的继承称单 ...

  10. PS2018学习笔记(19-24节)

    19-随心所欲变换 # 本节知识点 自由变换 移动变换 旋转变换 斜切变换 变形变换 扭曲变换 透视变换 # 本节段落表 自由变换命令 变换中的移动 再次变换命令 对象缩放 旋转 斜切 变形 扭曲 透 ...