ajax权威指南 豆瓣,从jQuery.ajax到fetch,你还差一本HTTP权威指南
作为前端出身的,码农,没有深入了解过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权威指南相关推荐
- jQuery ajax请求两次问题,jquery ajax请求了两次问题
页面有一个请求form: 订单编号 用户帐户 发货状态 请选择 未发送 已发送 查询 JavaScript请求部分: function showdatalist() { var username = ...
- Ajax设置超时时长,jquery ajax超时设置
var ajaxTimeoutTest = $.ajax({ url:'', //请求的URL timeout : 1000, //超时时间设置,单位毫秒 type : 'get', //请求方式 ...
- flask ajax 上传 图片,flask jQuery ajax 上传文件
1.html 代码 注:1.html 部分主要是一个form表单,其中表单的enctype = "multipart/form-data" 必须要有. 2.由于我的页面背景颜色设置 ...
- ajax调用ashx的方法,jquery.ajax请求aspx和ashx的异同 Jquery Ajax调用aspx页面方法
1.jquery.ajax请求aspx 请求aspx的静态方法要注意一下问题: (1)aspx的后台方法必须静态,而且添加webmethod特性 (2)在ajax方法中contentType必须是&q ...
- ajax+php+jq+面向对象,php+jquery+ajax+json的一个最简单实例
html页面: $(function(){ $("#send").click(function(){ var cont = $("input").seriali ...
- .ajax显示加载动画,jQuery Ajax 加载数据时异步显示加载动画
ajax加载后台数据就不说的那么细了. 看下面代码首先前台上放置代码 在js脚本文件中首先把这个图片动画隐藏 代码如下 $(document).ready(function () { $(" ...
- ajax请求php保存数据格式,jQuery ajax与php进行数据交互(数据格式问题)
近期涉及到 jquery 开发,因此对jQuery做了一些初步的学习,jquery功能相对比较强大些,尤其是对ajax支持,jquery ajax与服务器交互,这种搭配使得"局部刷新,异步更 ...
- ajax点击更改div,jquery ajax双击div可直接修改div中的内容
jquery ajax双击div可直接修改div中的内容 发布于 2017-04-03 17:26:16 | 127 次阅读 | 评论: 0 | 来源: 网友投递 jQuery javascript框 ...
- php jquery ajax裁剪图照片,php+jquery+ajax无刷新图片上传裁切,模拟flash头像上传实例...
这几天自己在写一个cms.之前在用到图片上传裁切的时候总是用的flash的,或者是swfupload之类的.用的还不熟练,所以今天就用ajax做一个图片上传裁切的实例.个人感觉还不错,现在就分享出来. ...
最新文章
- Swift - 使用SwiftHTTP通过HTTPS进行网络请求,及证书的使用
- mysql max connects_mysql max_connections 总是 4190
- java weblogic连接池,Weblogic JNDI 方式连接连接池 (工作中遇到的问题)
- aop springboot 传入参数_Springboot添加AOP打印请求参数
- 剑指 Offer 51-----59
- mysql选取最小值_MySQL:选择x最小值
- oracle ndv,CBO_ORACLE
- 初识数据库 1006
- linux定时刷新命令结果,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- html网页布局对联,html javascript 网站两侧对联广告
- 【POI 2007】Ridges and Valleys山峰和山谷(GRZ)
- XCode出现Could not locate device support files的解决办法
- sh计算机c盘如何管理,c盘瘦身三种方法详解
- iOS 禁用休闲时钟锁屏
- 我们什么都没有,只有爱
- aix系统日志转存日志服务器,AIX查看系统日志
- ECharts 使用xAxis.boundaryGap使x轴两边不留空白
- UWP 手绘视频创作工具技术分享系列 - 文字的解析和绘制
- 计算机地图制图相关论文,计算机地图制图原理、特点及发展趋势论文
- Linux学习笔记——Nginx安装部署