目前的前后端的数据交互大多都使用ajax利用JSON进行数据交换,在前端调用接口时遇到某些参数不需要传的情况时(接口将这些参数设置为可选的)我们应该将其设置为undefined还是null呢?它们两者在ajax请求中有什么区别呢?

一般我们的HTTP请求是按请求方法来区分的,如POSTGETPUT等,完整的请求方法列表可查看MDN。按照是否能够携带请求体对其进一步区分,我们先了解一下它们之间的不同:

具有请求体的请求

所谓具有请求体的请求,是指诸如POSTPUTPATCH等能够在请求体中包含数据的请求:

// xhr例
const xhr = new XMLHttpRequest()
xhr.open('POST', '/server', false);
// 其他设置
const data = JSON.stringify({ a: 1 })
xhr.send(data) // A// axios例
const data = { a: 1 }
axios.post('/server', { data: data }) // B

上面的行A和行B就是发送携带有请求体的请求。

虽然DELETE方法也可以携带请求体,但是一般来说不推荐这么做,没什么意义而且还可能会出现某些实现直接拒绝请求的情况,本文将其归于无请求体的请求的类别中。

无请求体的请求

无请求体的请求,也就是除去上文提到的那几种之外的请求,如GETHEADOPTIONS等请求:

// xhr例
const xhr = new XMLHttpRequest()
xhr.open('GET', '/server', false);
// 其他设置
xhr.send() // A// axios例
axios.get('/server') // B

可以看到此处A、B两行和上面的POST请求有明显区别:发送请求时没有携带请求体,此时如果需要向服务端传递数据,一般来说是将数据置于url的查询字符串部分,如/server?key=value

为什么要使用JSON.stringify处理请求体数据

可能很多人会有疑惑:为什么向服务端发送请求体时需要进行JSON.stringify的操作?(使用axios不需要的原因是其内部为我们进行了这步操作。)

对于前后端之间的HTTP请求来说,请求体和响应体其实是以字符串的形式在进行数据交换,因为这样能保证双方都能够识别,否则Java可识别不了你的Javascript对象。但是这个字符串也需要满足一定的规范,即必须能够处理成JSON:前端发送请求时使用JSON.stringify将Javascript对象处理成字符串,接收到响应时使用JSON.parse做反向操作。

null vs undefined

说了半天终于到了主题,其实在前端的开发中它们也是容易被混淆的,一般来说遵循下面这个规则使用:

  • undefined 表示(暂时)还不存在值,一般可以用作普通数据类型的占位
  • null 表示目前它就是null值,一般可以用作引用类型的占位

在ajax请求中,它们的区别就在于null在JSON中是合法的,而undefined是不存在于JSON中,在请求体中地处理中就会得到不同的结果:

JSON.stringify({ key: null }) // '{"key": null}'
JSON.stringify({ key: undefined }) // '{}'

如果在Chrome Devtools中查看请求体时,前者能够看到{key: null},而后者将是{}。对于服务端实现来说,兼容这两种情形一般都非常容易,所以区别不大。

对于交互双方来说能够相互理解是必要的,双方遵循统一的JSON规范就是为了达到这个目的。

但是对于无请求体的请求来说,情况稍有些不同,以GET请求为例,当我们将想要给服务端传递数据时一般会将其放置在url的查询字符串中,此时由于不会进行JSON.stringify的操作,故得到的结果可能不是想要的:

const key = null
axios.get(`/server?key=${key}`) // '/server?key=null'const key = undefined
axios.get(`/server?key=${key}`) // '/server?key=undefined'

此时它们会成为字符串url的一部分,对于服务端来说接收的key值也是以字符串进行处理的,所以可能会得到意向不到的结果,而且两者之间的差别很大,所以在处理时需特别注意。

总结

在有请求体的请求中,当不需要设置某些属性时,将其置为nullundefined均可,个人推荐使用undefined,毕竟看着干净些;但对于无请求体的请求中,如果需要在url中嵌入变量,一定要注意此变量是否可能为nullundefined,以防错误请求。

null、undefined在ajax请求中的区别相关推荐

  1. 使用jQuery在AJAX请求中添加标头

    本文翻译自:Add header in AJAX request with jQuery I would like to add a custom header to an AJAX POST req ...

  2. ajax on ture,Ajax请求中的async:false/true(同步/异步)的作用

    async. 默认是true,即为异步方式,$.Ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发$.Ajax里的success方法,这时候执行的是两个线程.若要将其设置为fa ...

  3. ajax on ture,细数Ajax请求中的async:false和async:true的差异

    实例如下: function test(){ var temp="00"; $.ajax({ async: false, type : "GET", url : ...

  4. ajax 传输中文乱码,关于Ajax请求中传输中文乱码问题的解决方案

    今天遇到一个问题,有关ajax 请求中传输中文,遇到乱码的问题. 如下代码: function UpdateFolderInfoByCustId(folderId, folderName, custI ...

  5. ajax配套字符串,在ajax请求中填充数据字符串

    我有一个表单可以有不同数量的文本字段(包含转换值).他们的名字是例如:"textfield_eng","textfield_ger","textfie ...

  6. ajax请求数据用于另一个ajax,在另一个AJAX请求中使用数据

    我正在学习ruby,但是我正需要一些JS/JQuery来处理一个我正在和朋友一起工作的小项目.我们正在使用Last.fm API,并试图构建一个页面,我们将从两个不同的URL调用Json数据.在另一个 ...

  7. ajax中解决乱码的问题,关于Ajax请求中传输中文乱码问题的解决方案

    今天遇到一个问题,有关ajax 请求中传输中文,遇到乱码的问题. 如下代码: function UpdateFolderInfoByCustId(folderId, folderName, custI ...

  8. ajax 公共请求头部,ajax请求中全局增加请求头,如常见的token

    加入当前的地址栏中保存的需要增加的请求头为例 url地址为: http://192.168.1.13:8080/demo/index.html?token=c7c8e210-7f07-472d-b88 ...

  9. ajax请求中带判断语句例子,jQuery中借助deferred来请求及判断AJAX加载的实例讲解...

    ajax请求异步队列加载我们在开发程序的时候通常会碰到使用ajax加载数据显示到列表的情况.ajax默认使用异步加载(async:true).为什么不使用同步呢,因为ajax同步加载会UI渲染线程阻塞 ...

最新文章

  1. C++/C++11中头文件numeric的使用
  2. Worktile CTO 管理经验分享:如何在研发团队落地OKR?研发团队目标如何管理?
  3. Axios——Axios封装DEMO
  4. 华为悬红“奥林帕斯奖”,促进数据产业基础技术研究与生态建设
  5. [leetcode]693. 交替位二进制数
  6. 来自Google的面试题,真的有趣!果然与众不同
  7. 使用 .NET HttpClient 下载 PDF 文件的DEMO
  8. 使用 SoundSource 取代Mac系统内置的音量控制器
  9. recovery 调试
  10. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(七)-SQL注入字符型
  11. LCD12864液晶显示屏引脚,功能介绍【160字】【原创】
  12. 饱受争议的闪电网络,能在2020年迎来大爆发吗?
  13. 使用webcollector爬虫技术获取网易云音乐全部歌曲
  14. 个人笔记:算法讲座3.4——货币系统(完全背包)
  15. 如何分辨及举报钓鱼网站/诈骗网站
  16. [Nucleo-F411RE] 第1篇---新建一个工程
  17. Hamming Embedding 汉明嵌入
  18. python -- 计算 平方,乘方,平方根
  19. 【联邦学习】联邦学习量化——non-iid数据集下的仿真
  20. PFA树脂的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. 用python画棒棒糖_Turtle绘制四叶草
  2. 互联网营销之用户标识
  3. 福利:如何使用思维导图,内附Xmind8破解
  4. Dependency(依赖)
  5. 谋士社区DG:最简单的方法就是最好的方法
  6. 使用centos7.3搭建KMS服务器
  7. Android面试题-机型适配之痛,例如三星、小米、华为、魅族系统问题处理方式
  8. 【Bug_Solidworks】真正成功解决Solidworks2019无法获得下列许可期望的Soliworks监控程序已关闭问题(-97,121,0)
  9. Unity GoogleVR(一)—— 解决安卓打包黑屏、闪退
  10. VS2015+OpenCV4.1.1拓展模块配置主要错误解决方案(含缺少文件百度云链接)