前端培训-初级阶段-场景实战(2019-06-06)-Content-Type对照表及日常使用

简介: 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。axios 日常使用上,感觉不如 $.ajax 但是我之前使用的时候不是改入参就是改方法反正是都解决了。我也知道问题出在 content-type 上。之前用的构建开发工具用的是 proxy 代理,不知道有老哥用过没,好几年前初次开发的时候就不更新了,还有 bug。索性换 axios 代理一下吧,然后报错了。

今天讲什么?


  1. content-type 是什么


  1. MIME 对照表


  1. axios 为什么感觉不如 $.ajax


  1. 带你领略 axios 正确打开方式


content-type 是什么


Content-Type 实体头部用于指示资源的 MIME类型 media type


在响应中,用来描述服务端实际发送给客户端的数据的类型。


在请求中,比如 POST请求,是指客户端给服务器实际发送的数据的类型。


双方根据这个值,来选择适合的方式解析数据。


MIME 类型组成方式


type/subtype,如application/jsontext/htmltext/plain


对大小写不敏感,但是习惯写小写。


content-type 组成方式


Content-Type:media-type; charset,如Content-Type: text/html; charset=utf-8


表单中的应用


<form action="/" method="post" enctype="multipart/form-data"> 想上传文件的时候


<form action="/" method="post" enctype="application/x-www-form-urlencoded"> 默认


为什么想上传文件不能用第二个呢?带着你的问题往后看吧


MIME 对照表


Media Types -全量的对照表


MIME 分类


type关键词 描述 示例
text 文本。复制粘贴的里面常见。 text/html html页面, text/css css文件,text/plain 通用文字(默认格式)
image 图片。input.files[0].type 返回的时候用于判断类型。input accept="image/*" 允许选择所有图片文件 image/png png图片, image/jpeg jpg图片
audio 音频。同上 audio/wav,audio/mpeg mp3文件
video 视频。同上 video/mp4 MP4文件
application 二进制数据 application/octet-stream 通用类型(默认格式),application/pdf
multipart 复合类型 multipart/form-data


常见 MIME


key 描述
application/octet-stream 默认值,或者可以理解为未知的应用程序文件浏览器会像对待设置了 HTTP 头 Content-Disposition 值为 attachment 的文件一样来对待这类文件。(微信下载文件)
text/html 可以理解为 html、xml 文件。
text/plain 默认值,也可以理解为未知格式的文本文件。文本文件嘛,没格式就只看字也不是啥大问题
image/png 常见图片类型,一般上传图片的时候判断
image/jpeg 常见图片类型,一般上传图片的时候判断
image/gif 常见图片类型,一般上传图片的时候判断
multipart/byteranges 用于把部分的响应报文发送回浏览器。常见于请求视频资源返回206状态码
application/json JSON 格式
multipart/form-data 用于带文件上传的表单提交。作为多部分文档格式,由边界线(一个由'--'开始的字符串)划分出的不同部分组成。每一部分有自己的实体,以及自己的 HTTP 请求头,Content-DispositionContent-Type
application/x-www-form-urlencoded 普通的 get&post 请求。数据被编码为键/值对(a=1&b=2)这是标准的编码格式。


axios 为什么感觉不如 $.ajax


(同样代码 jquery 好使,axios 不好使,axios 有 bug 吧)-这个应该是我听到最多的吐槽了。测试地址


axios 与 $.ajax 设计思路、或者说历史场景


  1. jquery 非常棒,他存在解决了各个浏览器版本不一致的问题,提供了统一的 api,极大的简化了我们的操作。


  1. axios 拥抱现代浏览器,提供跨平台(Node发请求)、 Promise等。


get 请求


对于 get 请求其实没有太多说的,请求的参数会拼在 url 上,如 https://www.lilnong.top/CORS/lnong?a=1&b=2,其中 a=1&b=2 就是带过去的参数


同样两个使用,我们会发现 axios 的没有带过去参数。


bVbtqVM.webp.jpg

0.png


这个时候兄弟们就开始说,我写了为什么传不过去。垃圾垃圾。针对上面的问题兄弟们骂完之后,还是要解决问题的。


  1. 手动拼写,兄弟也是虎的可以

11.png


  1. qs$.param({a:1,b:2}) 等类库解决处理问题,然后手动拼接


  1. 正确答案(axios 是使用 params 来发送 get 的数据的)


12.png


post 请求


bVbtrwo.webp.jpg


对于 post 请求来说就有好几种情况了


  1. application/x-www-form-urlencoded 这种情况等于把 get 方式的参数拿到 请求体中存放。编译格式是一模一样的。


  1. application/json 请求体中就是如下的JSON字符串{a:1,b:2}


  1. multipart/form-data 请求体中就是这种块的结构。


bVbtq7F.webp.jpg


好,那我们接着看兄弟们为什么要吐槽。同样,我 ajax 怎么好使,axios ****


bVbtq6C.webp.jpg


  1. data不行,我们换params,嗯这里其实分为两个情况


  1. 后台大哥说收到了,嗯,post 也是 params的结论就出来了
  2. 过几天另一个后台大哥说收不到。很奇怪,又开始揪头发。
  3. 这里说一下为什么有的时候能收到,有的时候不行。首先 params 带过去的参数会拼写在 url 上。如果严格来按规定做的话,他就是拿body 的信息就导致拿不到。不按规定来,url的构建一次,body的覆盖一次,就导致拿到了。


  1. 有的人比较机灵,换 params 发现不怎么好使,突然发现官网的例子,我来试一试。后台大哥怎么还收不到?这里其实 content-type 被改成了 application/json。一般来说老后台都不会适配这种格式。


axios({method:'post'}) 也是这种格式

bVbtraI.webp (1).jpg

13.png


  1. 没办法了?嗯,他们又开始自己拼接。嗯,这次有混过去了


13.png


  1. transformRequest 大法,我这个方法里面,给他处理一番。


bVbtref.webp.jpg


  1. FormData 大法好,精准识别,也算是正确的表单提交.


bVbtreO.webp.jpg


  1. URLSearchParams 方案等同于 Qs 的类库,只不过是浏览器支持的,当然兼容性也不怎么样


bVbtrwy.webp.jpg


带你领略 axios 正确打开方式


  1. 使用 get 要用 params 来发送请求


  1. 使用post要用data来发送请求
  1. 默认为 application/json 格式
  2. 可以通过 FormData 来进行修改
  3. 更建议全局 transformRequest 的方案


  1. axios 支持 Promise


axios.get('/user?ID=12345')
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });


4.axios 支持 Node 环境

5.配置默认值,方案1更痛快,可以增加一些通用的headers

a.全局的 axios 默认值


axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;

 

b.实例默认值


// 创建实例时设置配置的默认值
  var instance = axios.create({
    baseURL: 'https://api.example.com'
  });
  // 在实例已创建后修改默认值
  instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;


6.拦截器,可以拦截错误,进行上报。或者打印日志。


// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });


总结


content-type 很重要,在 req 中是告知服务器应该用什么样的格式去解析数据,rsp 中是让浏览器端去如何解析数据。


根据对应的类型,传对应的格式,才可以正确的收发。


参考资料


  1. MIME 类型 --MDN


  1. axios --看云
相关文章
|
7天前
|
缓存 前端开发 搜索推荐
前端性能优化实战:提升网页加载速度
前端性能优化实战:提升网页加载速度
|
15天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
32 2
|
16天前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
27 2
|
22天前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
19 1
|
23天前
|
人工智能 资源调度 数据可视化
【AI应用落地实战】智能文档处理本地部署——可视化文档解析前端TextIn ParseX实践
2024长沙·中国1024程序员节以“智能应用新生态”为主题,吸引了众多技术大咖。合合信息展示了“智能文档处理百宝箱”的三大工具:可视化文档解析前端TextIn ParseX、向量化acge-embedding模型和文档解析测评工具markdown_tester,助力智能文档处理与知识管理。
|
30天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
127 2
|
30天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
37 0
|
30天前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
30天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
30天前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。