HTTP首部对application数据格式的设置

最近在公司实习,对HTTP数据报和前后端的交互、调接口有了更多的了解,特此想记录下来,也顺便分享一下。

先是接触到了Postman这款谷歌插件,作用是用来模拟前端发送HTTP报文,在与前端联调前供后端自己进行调试。

其中在使用Postman模拟前端发送数据时,了解到设置Body数据编码有几个知识点:

  • form-data 它会将表单的数据处理为一条消息(一条包含所有key-value的类似json字符串),以标签为单元,用分隔符分开。对应header中的content-type=multipart/form-data。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来说明文件类型;content-disposition,用来说明字段的一些信息。由于有boundary隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。
  • x-www-form-urlencoded表示的是表单数据,对应header中的content-type=application/x-www-form-urlencoded,一般我们常用的form表单进行POST提交时,默认就是这个编码形式。
  • raw可以上传任意格式的文本,可以上传text、json、xml、html等各种文本类型。当传json格式时,相当于请求头设置content-type=application/json,此时对应后台SpringMVC框架的@RequestbBody Entity的接收方式。
  • binary等同于Content-Type:application/octet-stream。只可上传二进制数据,通常用来上传文件,由于没有键值,所以一次只能上传一个文件。

attention:
form-data与x-www-form-urlencoded不同之处在于(multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息(所有的键值对嵌套在一条信息里); x-www-form-urlencoded:只能上传键值对,但每个键值对都是一个独立的单元。)

 

后端自己完成了调试后,在与前端进行联调时,发现接收不到传来的数据,debug进去后台发现接收到的request的parameters属性的paramHashValues为空,也就是size=0,于是想到可能是前端传来的数据文本类型不一致,导致后端无法接收。

为此搜寻到两篇博客,提供了解决的思路,特此记录一下:

https://blog.csdn.net/oxluan/article/details/78284674 vue-resource post请求的坑

https://blog.csdn.net/weixin_39716452/article/details/79034210 application/x-www-form-urlencoded还是application/json

最后发现前端传来的是一行jason数据序列,而后台代码使用的是公司自己搭建的框架,需要根据原始的request去getParametersMap再去根据迭代器逐个将表单提交的key-value数据提取出来存到一个继承了HashMap的通用实体对象PageData中。这个要求HTTP头部的Content-Type为application/x-www-form-urlencoded而不是application/json,否则会接收不到数据,而且数据提交的方式必须是按照原始表单以key-value值一个键值对为一个单位来传,不能将所有键值对都包含在一行序列单位,这个涉及到前端框架vue的一些提交表单的方式,需要前后端统一协调好(一般是以后台为基准~)。

 

总结:

当你需要使用content-type=application/json且后台使用@RequestBody,你无法再从原始的request的paramter中获取请求数据。选择application/x-www-form-urlencoded还是application/json,得看你是否有从request.paramter获取请求数据的需求。一般用SpringMVC框架都会封装好request,开发者不需要操作request底层,所以可不用考虑这个问题,根据主流的规范来操作应该是没有大的问题。然鹅,好的企业往往会自己开发搭建合适的框架,而不用市面上流行的开源框架,所以,我们也得多了解些。

 

你可能感兴趣的:(request传数据,前后端联调,前后端数据交互,Postman,实习经历)