作为前端出身的,码农,没有深入了解过HTTP,一直以来靠抹平XMLHttpRequest种种细节的jq发送http请求,直到有一天我想用fetch的时候...遇到了许多莫名的问题。这些问题就好象是你想学vue的时,折腾半天webpack;想写ES6时,折腾半天babel配置;想学node时,不知无从下手。我想这种情况,或许只有非CS出身前端出身的程序员才会理解吧。

有一天我发送了这么一个请求(不要问我为什么查询用POST方法)

let _this = this;

let data = {

pageIndex: 1,

pageSize: 20,

key: getParam('key'),

cid: getParam('cid'),

sortKey:'new'

};

$.ajax({

type: 'POST',

url: `${api}/search/search.do`,

data: data,

success(json){

if (json.code === 1000) {

_this.items = json.data;

}

}

})

一切正常...然后我改成fetch发送吧。

fetch(`${api}/search/search.do`, {

method: "POST",

body: JSON.stringify(data)

})

.then(response => {

if (response.ok === true) {

return response.json();

}

})

.then(json => {

if (json.code === 1000) {

_this.items = json.data;

}

})

.catch(err => {

console.log('getJson error' + err)

})

是的...我以为全世界大多数请求都是用json沟通的。

于是我仔细对比了两次请求的不同。

fetch

jquery

二者的 Content-Type是不同的,我们可以看到fetch请求,因为我没有在请求头里定义类型,所以当前是text/plain,即普通文本类型。为什么jquery发出的却是application/x-www-form-urlencoded呢?

...那当然是因为jq的ajax方法自带默认配置啊...(其实也可能是因为XMLHttpRequest对象发送POST请求有默认的Content-Type配置,已确认并未配置。)

jquery源码

所以application/x-www-form-urlencoded到底是一种什么样的类型呢?

jquery发送的数据

可以看到我们发送的数据挺好的...

fetch发送的数据

但是对比点击 view source后的结果可以看出,fetch发出的是json格式,而jq发出的请求是这样的

jq请求 view source

再仔细看它的类型application/x-www-form-urlencoded,前面先不管... urlencoded,我们知道js提供encodeURI方法,用于将完整的URI转义。所以这一串数据,应该是 encodeURI('pageIndex=1&pageSize=20&key=女装&cid=1&sortKey=new')返回的内容。

回到我们最初的目的。用fetch做同样的事情...首先我们要把对象遍历成key=value的形式。

我们写个转换的函数(未考虑深层对象的情况)

function getUriEncodeParam(data) {

let newArr = Object.keys(data);

let param = '';

newArr.forEach(function (item, idx) {

if (idx === 0) {

param += item + '=' + data[item];

} else {

param += '&' + item + '=' + data[item];

}

});

return encodeURI(param);

}

//fetch

fetch(`${api}/search/search.do`, {

method: "POST",

headers:{

'content-type':'application/x-www-form-urlencoded; charset=UTF-8'

},

body: getUriEncodeParam(data)

})

成功响应,请求头部分也按照预期,响应的数据也正常了。

同时也自惭形秽用jquery发请求那么多年(好像也有2年了...)似乎只关注url,data,回调但很少注意到请求头的一些东西...

以下提几个常用的POST数据类型。

application/x-www-form-urlencoded

浏览器原生的

表单,当 method属性值为 post 时, enctype属性可以定义提交给服务器的媒体类型,application/x-www-form-urlencoded是默认值。可取的值还有multipart/form-data和text/plain(HTML5)。

multipart/form-data

用于发送文件等二进制数据。

multipart/form-data类型的请求

application/json

text/xml

ajax权威指南 豆瓣,从jQuery.ajax到fetch,你还差一本HTTP权威指南相关推荐

  1. jQuery ajax请求两次问题,jquery ajax请求了两次问题

    页面有一个请求form: 订单编号 用户帐户 发货状态 请选择 未发送 已发送 查询 JavaScript请求部分: function showdatalist() { var username = ...

  2. Ajax设置超时时长,jquery ajax超时设置

    var ajaxTimeoutTest = $.ajax({ url:'',  //请求的URL timeout : 1000, //超时时间设置,单位毫秒 type : 'get',  //请求方式 ...

  3. flask ajax 上传 图片,flask jQuery ajax 上传文件

    1.html 代码 注:1.html 部分主要是一个form表单,其中表单的enctype = "multipart/form-data" 必须要有. 2.由于我的页面背景颜色设置 ...

  4. ajax调用ashx的方法,jquery.ajax请求aspx和ashx的异同 Jquery Ajax调用aspx页面方法

    1.jquery.ajax请求aspx 请求aspx的静态方法要注意一下问题: (1)aspx的后台方法必须静态,而且添加webmethod特性 (2)在ajax方法中contentType必须是&q ...

  5. ajax+php+jq+面向对象,php+jquery+ajax+json的一个最简单实例

    html页面: $(function(){ $("#send").click(function(){ var cont = $("input").seriali ...

  6. .ajax显示加载动画,jQuery Ajax 加载数据时异步显示加载动画

    ajax加载后台数据就不说的那么细了. 看下面代码首先前台上放置代码 在js脚本文件中首先把这个图片动画隐藏 代码如下 $(document).ready(function () { $(" ...

  7. ajax请求php保存数据格式,jQuery ajax与php进行数据交互(数据格式问题)

    近期涉及到 jquery 开发,因此对jQuery做了一些初步的学习,jquery功能相对比较强大些,尤其是对ajax支持,jquery ajax与服务器交互,这种搭配使得"局部刷新,异步更 ...

  8. ajax点击更改div,jquery ajax双击div可直接修改div中的内容

    jquery ajax双击div可直接修改div中的内容 发布于 2017-04-03 17:26:16 | 127 次阅读 | 评论: 0 | 来源: 网友投递 jQuery javascript框 ...

  9. php jquery ajax裁剪图照片,php+jquery+ajax无刷新图片上传裁切,模拟flash头像上传实例...

    这几天自己在写一个cms.之前在用到图片上传裁切的时候总是用的flash的,或者是swfupload之类的.用的还不熟练,所以今天就用ajax做一个图片上传裁切的实例.个人感觉还不错,现在就分享出来. ...

最新文章

  1. Swift - 使用SwiftHTTP通过HTTPS进行网络请求,及证书的使用
  2. mysql max connects_mysql max_connections 总是 4190
  3. java weblogic连接池,Weblogic JNDI 方式连接连接池 (工作中遇到的问题)
  4. aop springboot 传入参数_Springboot添加AOP打印请求参数
  5. 剑指 Offer 51-----59
  6. mysql选取最小值_MySQL:选择x最小值
  7. oracle ndv,CBO_ORACLE
  8. 初识数据库 1006
  9. linux定时刷新命令结果,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  10. html网页布局对联,html javascript 网站两侧对联广告
  11. 【POI 2007】Ridges and Valleys山峰和山谷(GRZ)
  12. XCode出现Could not locate device support files的解决办法
  13. sh计算机c盘如何管理,c盘瘦身三种方法详解
  14. iOS 禁用休闲时钟锁屏
  15. 我们什么都没有,只有爱
  16. aix系统日志转存日志服务器,AIX查看系统日志
  17. ECharts 使用xAxis.boundaryGap使x轴两边不留空白
  18. UWP 手绘视频创作工具技术分享系列 - 文字的解析和绘制
  19. 计算机地图制图相关论文,计算机地图制图原理、特点及发展趋势论文
  20. Linux学习笔记——Nginx安装部署

热门文章

  1. CAD怎么转换成JPG图片?教大家一个好用的转换方法
  2. 【51单片机练习3——智能电梯控制系统1】
  3. 产品开发与python_生产 - MBA智库百科
  4. 液位COD水质监测仪 水质传感器
  5. 服务器虚拟主机是什么意思?
  6. 单是重启redis那么它里边的数据依然存在
  7. Linux中在zsh下如何安装autojump
  8. Python循环语句_for循环
  9. Linux进程显示与删除
  10. GPT对比GPT-2