背景

随时随地给大家提供技术支持的葡萄又来了。这次的事情是这样的,提供demo属于是常规操作,但是前两天客户突然反馈压缩传输模块抛出异常,具体情况是压缩内容传输到服务端后无法解压。
![](https://img-blog.csdnimg.cn/img_convert/8e28a96a624b76d05911340b54afed54.png

由于代码没有发生任何变动,前端相关依赖也没有升级,服务端java版本也没有变化,所以我们可以推定为环境问题;进一步仔细检查,经过反复对比后突然发现服务端收到的压缩内容变长了;和前端请求内容进行对比,发现所有的\r和\n都变成了\r\n。

综合以上分析我们初步判断:问题出在了浏览器转译之中。为了验证猜想是否正确,葡萄将chrome版本回退到92版,异常消失,服务端接收的内容也没有被替换。

问题是顺利解决了,但是Chrome POST数据内容居然会在传输过程中发生变化。一直擅长大前端技术的葡萄绝不认输,为了弄明白这一原因,我们来看看POST的细节操作到底有什么。
控制字符
首先我们需要搞清楚几个控制字符的含义。

  • 回车符(CR)和换行符(LF)是文本文件用于标记换行的控制字符(control characters)或字节码(bytecode)。
  • CR = Carriage Return,回车符号(\r,十六进制 ascii 码为0x0D,十进制 ascii 码为13),用于将鼠标移动到行首,并不前进至下一行。
  • LF = Line Feed,换行符号( \n, 十六进制 ascii 码为 0x0A,十进制 ascii 码为10)。
    紧邻的 CR 和 LF(组成 CRLF,\r\n,或十六进制 0x0D0A)将鼠标移动到下一行行首。(Windows 操作系统默认的文本换行符为 CRLF;Linux 以及 macOS 系统默认使用 LF,早期的 mac os 系统使用 CR 换行。)

在代码管理中,在不同操作系统下CRLF会有很大不同。下面在不同系统中为大家实际演示一下:
在Mac Visual Code中新建一个文档默认为LF,而Windows中为CRLF,可以选择切换行尾序列的内容的类型。


Mac版Visual Code


Windows 版

面对这种情况,需要开发者统一CRLF,以免不同操作系统开发导致代码管理的混乱。

POST传输的数据变化

弄明白了在不同系统中,控制字符会出现不同的原因,接下来我们就需要搞清楚为什么POST的数据在传输过程中发生了变化。

![](https://img-blog.csdnimg.cn/img_convert/99cf5105fddca5e591a446cfeae74f06.png

我们来写个简单Demo测试一下。先在页面上放一个允许换行的textarea, 输入带换行的文本,获取内容看到只有\n转译。通过FormData直接post数据到服务端,然后直接返回,看到\n全部变成了\r\n。

            var uploadData = document.getElementById("ta").valuevar formData = new FormData();formData.append("data", uploadData)fetch("http://localhost:8088/spread/getpdf", {body: formData,method: "POST"}).then(resp => resp.text()).then(text => {console.log(JSON.stringify(text));document.getElementById("result").innerHTML= JSON.stringify(text)})

浏览器标识:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.83 Safari/537.36

回退Chrome到92版本,发送和接收文本此时编为一致:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36

深入探究这一原因,我们了解到互联网请求意见稿2046(RFC 2046)4.1.1.中有明确说明:

 “ The canonical form of any MIME‘text’ subtype MUST always represent aline break as a CRLF sequence. “

这里我们可以看到所有的文本类型都要使用CRLF,而Chrome只是修复了一个“bug”,对于用户而言,在普通文本中用户感知不到CR、LF和CRLF的区别,但是当使用场景转换到解压的文本内容就变得十分重要。

三种解决方式

大家都知道POST是HTTP的一个常用方法,而另一个我们常用的方法是GET。
关于GET和POST区别以及使用相关问题这里不做赘述,要解决POTS传输的数据变化问题,最相关的是Content-Type。

首先我们来了解Content-Type和MIME分别是什么:
Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。

![](https://img-blog.csdnimg.cn/img_convert/22c30aaaa9f82f216fcd64bd69dc2106.png

在POST中常用的Content-Type有application/x-www-form-urlencoded、multipart/form-data和application/json。

1、 application/x-www-form-urlencoded
将需要内容提交表单后,内容会按照name1=value1&name2=value2的方式编码,并且key和valu e都会进行URL转码。
对于"\n"和"\r" 会被转码为’%0A’和’%0D’,通过这种传输方式,避免了浏览器的对CRLF的修正可以解决以上问题。
但是这样转码会增加文本长度,原本1个字符变成了3个,结果是压缩的文本又变长了。

2、multipart/form-data
当需要想服务器提交文件时,就需要使用这种方式。前面代码中我们可以看到当formData是普通文本是会被修正,为了解决这个情况我们可以将string内容封装到Blob中作为文件流传输,来避免修正。
这样传输,服务端会以文件方式收到内容,直接读取Stream内容;对于压缩文本,这种处理方式最优。

           var formData = new FormData();formData.append("data", uploadData)formData.append("data1", new Blob( [uploadData]))

上图展示了同样的内容,使用不同方式进行传输。

3、 application/json
Json也是目前比较流行的传输方式,json的内容在post传输中也不会被改变,如果文本内容不长,也是不错的方式。

          fetch("http://localhost.charlesproxy.com:8088/spread/postjson", {headers: {'Content-Type': 'application/json',},body: JSON.stringify({data: uploadData}),method: "POST"}).then(resp => resp.text()).then(text => {console.log(JSON.stringify(text));document.getElementById("result").innerHTML= JSON.stringify(text)})

总结

作为一个前端er,除了HTML、CSS和Javascript三大件,熟练使用Axios等类库调用API,更不可忽视的是要了解如何调试网络请求,在项目出现问题时能快速定位到问题的所在。
![](https://img-blog.csdnimg.cn/img_convert/5fbaf63310b27f5eb84d65c9471a95ab.png

这里提供了在 Angular 框架下动态加载js文件时返回 Content-Type 为text/html 的Demo,大家感兴趣的可以自行下载试试。

Demo 地址: https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=NDc5OTJ8YmU1Mjk0NDN8MTY1MDI2MTI0M3wxfDUwOTgw

数据传输POST心法分享,做前端的你还解决不了这个bug?相关推荐

  1. 做前端的你还没用这些软件?? out 啦

    1. 编辑器 写代码只是生产软件过程中的一环.无论是数据结构.编译原理.操作系统还是组成原理都是编码的重要基础,试问没有学过编译原理的人能够针对性地进行编译优化吗?不懂操作系统的人能玩得转linux吗 ...

  2. 好程序员web前端培训分享做H5页面需要学什么

    好程序员web前端培训分享做H5页面需要学什么,很多人问过我这个问题,而问这个问题的人基本上都是刚听说过h5,处在懵懂的阶段,他们往往会被一些网上炫酷页面所吸引,开始的目的也很简单,能通过自己的努力做 ...

  3. 好程序员分享做HTML5页面你要懂得这些

    为什么80%的码农都做不了架构师?>>>    好程序员分享做HTML5页面你要懂得这些,很多人问过我这个问题,而问这个问题的人基本上都是刚听说过HTML5,处在懵懂的阶段,他们往往 ...

  4. web前端技术分享:前端开发与后端开发的区别是什么?

    相信很多人在技术岗都听到过前端和后端这两个职位,但是大部分人对前端开发与后端开发的区别是什么?并不是很清楚,下面小千就为大家详细的介绍一下两者的区别之处. web前端分享:前端开发与后端开发的区别是什 ...

  5. 做前端的你觉得很吃力?

    前端工作5年多.大部分前端原理.框架都能完全运用.工作中几乎遇不到解决不了的问题(除了那些恶心无法实现的需求)现在经常被安排去面试新人(被安排去面试,主要是工作能力比较突出的原因,公司还有很多3年以上 ...

  6. 做前端的你有没有觉得很吃力?

    前端工作两年多.大部分前端原理.框架都能完全运用.工作中几乎遇不到解决不了的问题(除了那些恶心无法实现的需求)现在经常被安排去面试新人(被安排去面试,主要是工作能力比较突出的原因,公司还有很多3年以上 ...

  7. 好程序员分享Web前端知识之HTML

    今天好程序员分享Web前端知识之HTML.Web前端技术由HTML.CSS和Javascript三大部分构成,而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知识点,因此对于初学者 ...

  8. 做前端的:你有没有觉得很吃力?

    转自:https://www.zhihu.com/question/425782106/answer/1543007211 前端工作两年多.大部分前端原理.框架都能完全运用.工作中几乎遇不到解决不了的 ...

  9. 爱创课堂分享web前端学习路线自学如何找到工作

    爱创课堂分享web前端学习路线自学如何找到工作,自学能不能学会WEB前端并且找到WEB前端开发岗位的工作取决于自身条件,如果基础好,自律性强那么将会容易很多,还有就是自学最难克服的并不是知识点,而是自 ...

最新文章

  1. 成绩从大到小排序c语言,刚学c语言,老师让用if编一个五个数字从大到小的排序,有那个大神能帮我,谢谢啦...
  2. DataTable 的 JSON 序列化
  3. mysql timestamp 插入null报错_读MySQL 5.7文档11.2 Date and Time Data Types总结
  4. jQuery 学习笔记之二 (jQuery代码风格)
  5. 京东广告联盟android,京东APP联盟SDKAndroid版接口说明文档1.0.PDF
  6. python发音-Python如何实现文本转语音
  7. 研磨设计模式学习笔记1--简单工厂(SimpleFactory)
  8. 众达两化融合贯标日记06~贯标启动会PPT
  9. psm倾向得分匹配法举例_【计量地图】倾向得分匹配法(PSM)理论、操作与案例...
  10. 你需要知道的WAMP5
  11. 福建省漳州市谷歌卫星地图下载
  12. 在字符串中输入回车换行或其它特殊字符
  13. 设置Win10系统我的电脑中不展示文件夹
  14. anmate.css怎么用,animate.css使用方法是什么
  15. c语言如何框出视频或图像中的车辆,[转载]视频图像中的车辆检测跟踪和分类
  16. 倒计时、定时器的五种方式,有这篇就够了
  17. Android tips(十二)--Android开发中使用矢量图
  18. java实现.费诺编码_香农费诺编码的matlab实现.doc
  19. mysql date 加一年_mysql日期怎么加一年
  20. 微信小程序网络请求配置问题及本地网络请求测试解决方案

热门文章

  1. 零零信安-DD数据泄露报警日报【第20期】
  2. python发送文件到指定的邮箱_怎么用qq邮箱发文件-用python发送139邮箱电子邮件和短信通知,让你不再错过重要信息...
  3. python基础语法复习[二] 函数、类
  4. HarmonyOS 2.0鸿蒙应用开发者官网地址
  5. AT2657 Mole and Abandoned Mine
  6. 字母异位词分组 两种解法 (Python)
  7. ipad发布会ipad_拥有ipad的成本
  8. tBOC-NH-PEG-SVA,甲酸叔丁酯-亚氨基-聚乙二醇-琥珀酰亚胺戊酸酯供应
  9. 无线网络中PPK-MIC和CKIP-CMIC的学习资料
  10. 美国一大学向勒索软件缴纳114万美元赎金,以防学术数据曝光