Form Data与Request Payload,你真的了解吗?

前言

做过前后端联调的小伙伴,可能有时会遇到一些问题。例如,我明明传递数据给后端了,后端为什么说没收到呢?这时候可能就会就会有小伙伴陷入迷茫,本文从chrome-dev-tools(F12调试器)中看到的FormDataRequestBody,给小伙伴们提供一种可能的思路。也给小伙伴们提供一些问题的探究方法。

简介

什么是FormData?什么是RequestPayload?不解释,直接上图:
在这里插入图片描述
在这里插入图片描述

区别?

因为这里触及了我的知识盲区,所以有了本文。这个答案是我在stackoverflow上得到的。首先还是贴问题,贴答案。

What’s the difference between “Request Payload” vs “Form Data” as seen in Chrome dev tools Network tab。
中文翻译:chrome开发者工具中的Request Payload与Form Data有什么区别?

Request Payload更准确的说是http request的payload body。一般用在数据通过POST请求或者PUT请求。它是HTTP请求中空行的后面那部分。(PS:这里涉及一个http常被问到的问题,http请求由哪几部分组成,一般是请求行,请求头,空行,请求体。payload body应该是对应请求体。)

一个请求伴随着header设置为Content-Type: application/json时候,看起来可能像这样:

POST /some-path HTTP/1.1
Content-Type: application/json{ "foo" : "bar", "name" : "John" }

如果你正常请求一个ajax。浏览器会简单的将你提交的内容作为payload展示出来,这就是它所能做的,因为它不知道数据来自哪里。

如果你提交了一个html表单并且配置上了method=“post”,并且设置了Content-Type: application/x-www-form-urlencoded或者Content-Type: multipart/form-data。那么你的请求可能长这个样:

POST /some-path HTTP/1.1
Content-Type: application/x-www-form-urlencodedfoo=bar&name=John

这里的form-data就是request payload。在这里,浏览器知道更多:它知道bar是提交表单的输入字段foo的值。这就是它向你展示的。

所以区别就是,他们只是因为Content-Type设置的不同,并不是数据提交方式的不同,这两种提交都会将数据放在message-body中。但是chrome浏览器的开发者工具会根据这个ContentType区分显示方式。

细节

好了,到这里我们知道了,其实都是放到了payload中。那么具体有什么区别呢?为什么有时候后端拿不到值呢?这就不得不说对payload的解析方式了。我们以几个chrome下的测试案例,来理一理这个逻辑。

传统的Form表单提交

场景构造

<form action="/" method="POST"><input name="name" type="text"><input name="password" type="text"><button>提交</button>
</form>

如果我这里点击提交按钮,就会触发浏览器的提交功能,那结果是什么样呢?
在这里插入图片描述
注意点

可以看到Content-Typeapplication/x-www-form-urlencoded
值得形式是以key1=value1&key2=value2的形式提交的。

传统的ajax提交

场景构造

function submit2() {var xhr = new XMLHttpRequest();xhr.timeout = 3000;var obj = {a: 1, b: 2};xhr.open('POST', '/');xhr.send(obj);
}

首先我们构造一个简单的函数,然后触发它。通过chrome反馈来看:
在这里插入图片描述
注意点

1.默认的Content-Type为text/plain
2.Request Payload会对非字符串做字符串转换。
3.通过xhr.send(JSON.stringify(obj));可修正要发的内容

axios方式提交

场景构造

由于axios已经是vue、react的准标配请求方式了,所以这里探究一下它。

首先我门看axios的文档,当post提交时候可以传递什么类型参数:
在这里插入图片描述
注意这个类型,我们分别构造两个场景。对应它。

function submit3() {var sence1 = 'name=123&val=456';var sence2 = {name: 123, val: 456};axios.post('/', sence1)
}

分别传递字符串与对象,提交post请求,然后观察结果:

场景1——传递字符串时候的结果:
在这里插入图片描述
场景2——传递对象的结果:
在这里插入图片描述
注意点

1.当我们传递字符串的时候,Content-Type自动转为xxx-form-xxx的形式。当为对象的时候,自动转化为xxx/json

2.字符串的时候以key1=val1&key2=val2的形式体现,对象以JSON字符串形式体现。

总结

探索了这么多种情况之后,那么我们回顾一下:

Content-Type的差异

1.传统的ajax请求时候,Content-Type默认为"文本"类型。
2.传统的form提交的时候,Content-Type默认为"Form"类型。
3.axios传递字符串的时候,Content-Type默认为"Form"类型。
4.axios传递对象的时候,Content-Type默认为"JSON"类型

Content-Type的值,Form与非Form时,payload的区别。

1.都只支持字符串类型(以上探究的几种情况)
2.Form需要传递的格式为key1=value1&key2=value2,类似GET请求的QueryString格式
3.非Form一般为JSON.stringify(formDataObject)形式

后端取不到值?

无论何种形式传递,后端解析表单信息的时候,会考虑Content-Type。如果是JSON字符串的话,后端解析payload的内容时候,肯定要去解析JSON啦。如果是key1=value1&key2=value2的形式,则需要去分割字符串。

当然这些事情一般后端使用的框架会去处理,但是框架给后端提供取值接口有可能是不同的,所以前端的小伙伴在处理请求问题时,一定要跟后端小伙伴商量好,是用JSON还是FormData哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言运行程序导出表格,C语言--输出打印表格

//// invest.c// day05//// 打印一个投资利率表// 打印100元在指定年份内投资&#xff0c;按相应回报率计算收益 &#xff0c;程序输出如下:// 利率: 6%年份:5//// Year 6%7% 8% 9% 10%// 1 106 107 108 109 110// 2 112.36 114.49 116.64 118.81 121// 3 119.10 122.50 125.97…

Java对象复制或拷贝之BeanUtils.copyProperties() 用法,一行语句实现对象间快速复制

java对象复制或拷贝之BeanUtils.copyProperties() 用法&#xff0c;一行语句实现对象间快速复制 即 BeanUtils.copyProperties(源对象, 目标对象); 使用注意事项&#xff1a; 1.BeanUtils是org.springframework.beans.BeanUtils&#xff0c;不是org.apache.commons.beanutils.…

c语言c98标准,1.3.2 C语言标准

1.3.2 C语言标准Dennis Ritchie和Brian Kernighan的经典著作《C程序设计语言》(Prentice Hall)自1978年***出版后&#xff0c;一直扮演着非正式的C语言规范的角色。这个版本的C语言俗称K&R C。C语言很快替代了Basic语言和其他语言&#xff0c;成为微型计算机编程的通用语言…

计算机网络知识点复习

基础 1.说下计算机网络体系结构 计算机网络体系结构&#xff0c;一般有三种&#xff1a;OSI 七层模型、TCP/IP 四层模型、五层结构。 简单说&#xff0c;OSI是一个理论上的网络通信模型&#xff0c;TCP/IP是实际上的网络通信模型&#xff0c;五层结构就是为了介绍网络原理而折…

单链表插入元素 注释 c语言,数据结构之无头单链表的相关练习题——C语言实现(详细注释)...

本文中所用到的相关链表操作实现均在我上篇博客中&#xff1a;https://blog..net/haoziai905/article/details/870992871.删除无头单链表的非尾结点这道题的重点就在于最后的非尾结点上&#xff0c;既然是非尾结点&#xff0c;则说明其下一个结点必定不为空。而我们通常所使用的…

n个1组成的整数能被2013整除c语言,求大神解算法,“编写程序,求n至少为多大时,n个1组成的整数能被2013 整除。”...

编写程序&#xff0c;求n至少为多大时&#xff0c;n个1组成的整数能被2013 整除。使用python黑科技:i 1while int(1 * i) % 2013:i 1print(i)不使用黑科技:i s t 1while s % 2013:i 1t t * 10 % 2013s (s t) % 2013print(i)而事实上可以从数论的角度看。20133*11*61&a…

Java基础知识点复习

转载&#xff1a;https://mp.weixin.qq.com/s/M-6RSRcRd3X93cR7VXpanw Java概述 1.什么是Java&#xff1f; Java是一门面向对象的编程语言&#xff0c;不仅吸收了C语言的各种优点&#xff0c;还摒弃了C里难以理解的多继承、指针等概念&#xff0c;因此Java语言具有功能强大和…

c语言 求2到100的素数,2是素数吗(c语言输出100以内素数)

2是质数吗&#xff1f;除了1和本身外&#xff0c;不能被其他任何自然数整数的自然数。又叫做素数&#xff0c;最小的素数是2&#xff0c;也是唯一的偶质数 100以内的质数共有25个&#xff0c;这些质数我们经常用到&#xff0c;可以用下面的.1不是素数&#xff0c;最小的质数是2…

为什么都说Dubbo不适合传输大文件?Dubbo支持的协议

背景 之前公司有一个 Dubbo 服务&#xff0c;内部封装了腾讯云的对象存储服务 SDK&#xff0c;是为了统一管理这种三方服务的SDK&#xff0c;其他系统直接调用这个对象存储的 Dubbo 服务。用来避免因平台 SDK 出现不兼容的大版本更新&#xff0c;导致公司所有系统修改跟着升级…

中科院C语言应聘机试编程题6,中科院计算所保研笔试+机试+面试经验分享

计算所JDL(先进人机交互)实验室9月10号开始联系计算所导师&#xff0c;12号收到导师的回复&#xff0c;大致意思是老师让我提供三位本校推荐老师的联系方式&#xff0c;又问了是否有读博的打算&#xff0c;让我准备到计算所JDL面试&#xff0c;16号收到了他们的正式通知。老实说…

MySQL group_concat()详解

GROUP_CONCAT(xxx)&#xff1a;是将分组中括号里对应的字符串进行连接.如果分组中括号里的参数xxx有多行&#xff0c;那么就会将这多行的字符串连接&#xff0c;每个字符串之间会有特定的符号进行分隔。 对应的语法格式 # 将分组中column1这一列对应的多行的值按照column2 升序…

c语言编写劫持dll,c语言-----劫持自己02

在上一节 c语言-----劫持原理01 已经叙述了劫持原理&#xff0c;下边正式进入劫持实战1. 需要实现的功能在c语言中system("notepad") 可以打开一个记事本system("mspaint") 可以打开画图工具所以这次我们需要把 可以打开一个记事本 这个功能更改为 在控制…

Java中Runtime类

一、概述 Runtime类封装了运行时的环境。每个 Java 应用程序都有一个 Runtime 类实例&#xff0c;使应用程序能够与其运行的环境相连接。 一般不能实例化一个Runtime对象&#xff0c;应用程序也不能创建自己的 Runtime 类实例&#xff0c;但可以通过 getRuntime 方法获取当前R…

长春理工大学c语言实验题库,长春理工大学首届趣味心理知识竞赛初赛题库.doc...

长春理工大学首届趣味心理知识竞赛初赛题库长春理工大学首届趣味心理知识竞赛初赛题库心理知识简述1.心理学概念心理学是研究人的心理活动及其发生、发展规律的科学。人的心理是以不同的形式能动地反映客观事物及其相互关系的活动。人的心理活动包括有紧密联系的两个方面&#…

在Java中调用Python

写在前面 在微服务架构大行其道的今天&#xff0c;对于将程序进行嵌套调用的做法其实并不可取&#xff0c;甚至显得有些愚蠢。当然&#xff0c;之所以要面对这个问题&#xff0c;或许是因为一些历史原因&#xff0c;或者仅仅是为了简单。恰好我在项目中就遇到了这个问题&#…

android 导航动画,安利一个Android导航库

SlidingRootNav这是一个像DrawerLayout一样的抽屉式的导航库&#xff0c;这个库实现的抽屉在content view的下层&#xff0c;滑动之后&#xff0c;才能看到相应的导航页使用Gradle添加依赖compile com.yarolegovich:sliding-root-nav:1.0.2使用说明创建一个 content_view.xml或…

将String集合转为Integer集合的三种方法

第一种方法&#xff1a; List<String> list Arrays.asList("1", "2", "3", "4", "5");// method1 创建一个Integer类型的集合&#xff0c;循环遍历String类型的数组并把数据添加进集合List<Integer> integerLi…

android 界面组件,安卓开发学习周第三篇——Android中的UI组件

原标题&#xff1a;安卓开发学习周第三篇——Android中的UI组件在Android APP中&#xff0c;所有的用户界面元素都是由View和ViewGroup的对象构成的。View是绘制在屏幕上的用户能与之交互的一个对象。而ViewGroup则是一个用于存放其他View(和ViewGroup)对象的布局容器&#xff…

Spring Boot集成Druid出现异常报错的原因及解决

Druid 可以很好的监控 DB 池连接和 SQL 的执行情况&#xff0c;天生就是针对监控而生的 DB 连接池。本文讲述了Spring Boot集成Druid项目中discard long time none received connection异常的解决方法&#xff0c;出现此问题的同学可以参考下 文章目录Spring Boot集成Druid异常…

BigDecimal.ZERO替代new BigDecimal(0)

这里只是想分享下&#xff0c;平时如果我们想要定义一些BigDecimal类型的变量&#xff0c;可以先看看BigDecimal有没有已经先做了定义&#xff0c;如new BigDecimal(0)就可以用BigDecimal.ZERO来代替&#xff0c;如下&#xff1a; BigDecimal bigDecimal BigDecimal.ZERO;描述…