script ajax / XHR / XMLHttpRequest
s
利用XHR 调试发送form data表单数据,F5键刷新form表单URL ,http请求地址,获取token,提交。
如:http://pcp.cns*****.com/spcp-web/vmApply/submitApplyInfo.htm
在Chrome F12键console里提交如下语法内容,回车,即可数次重复提交。
(如下表单唯一刷新页面获取新变量token即可回车提交如下内容)
xhr = new XMLHttpRequest()
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){ //表示消息接受完成
if(xhr.status === 200){ //是否为成功的响应
console.log('success');
}else{
console.log(xhr.status);
}
}
}
xhr.open("POST","http://pcp.cnsuning.com/spcp-web/vmApply/submitApplyInfo.htm",true);
token = $('#token').val()
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8"); xhr.send('你的form表单内容,在第一次提交submit时F12键获取XHR里经过URL concode的表单数据内容' + token + '&diskSize=0')
案例1:
xhr = new XMLHttpRequest()
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){ //表示消息接受完成
if(xhr.status === 200){ //是否为成功的响应
console.log('success');
}else{
console.log(xhr.status);
}
}
}
xhr.open("POST","http://pcp.cnsuning.com/spcp-web/vmApply/submitApplyInfo.htm",true);
token = $('#token').val()
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8"); xhr.send('envId=34315&applyData=%7B%22vm%22%3A%7B%22basicInfo%22%3A%7B%22systemId%22%3A%223608%22%2C%22envType%22%3A%22prd%22%2C%22envName%22%3A%22SFTS_YH_PRD_Jiangbei+%E9%80%BB%E8%BE%91%E6%9C%BA%E6%88%BF+%3A+%E9%9B%A8%E8%8A%B1%E6%9C%BA%E6%88%BF%22%7D%2C%22deployInfo%22%3A%7B%22moduleType%22%3A%22%22%2C%22moduleName%22%3A%22%22%2C%22envCellId%22%3A%22%22%2C%22envGroupId%22%3A%22%22%7D%2C%22serverInfo%22%3A%7B%22useType%22%3A%222%22%2C%22middlewareId%22%3A%22179%22%2C%22osId%22%3A%22Red+Hat+Enterprise+Linux+Server+6.3+(64+Bit)%22%2C%22osName%22%3A%22Red+Hat+Enterprise+Linux+Server+6.3+(64+Bit)%22%2C%22packageId%22%3A%221221%22%2C%22vmNum%22%3A%2220%22%7D%2C%22diskInfo%22%3A%7B%7D%2C%22resourceInfo%22%3A%7B%22ldcId%22%3A%222%22%2C%22ldcName%22%3A%22%E9%9B%A8%E8%8A%B1%E6%9C%BA%E6%88%BF%22%2C%22netZone%22%3A%22inter%22%2C%22advance%22%3A%7B%22region%22%3A%22os_JiangBei_ocata02%22%7D%7D%7D%7D&remark=jiangbei+100&needSaveOverProof=false&token=' + token + '&diskSize=0')
https://www.cnblogs.com/syfwhu/p/6116323.html
在XHR诞生前,网页要获取客户端和服务器的任何状态更新,都需要刷新一次,在XHR诞生后就可以完全通过JS代码异步实现这一过程。XHR的诞生也使最初的网页制作转换为开发交互应用,拉开了WEB2.0的序幕。
XHR是一种浏览器API,极大简化了异步通信的过程,开发者并不需要关注底层的实现,因为浏览器会为我们完成这些工作,如连接管理、协议协商、HTTP请求格式化等等。最初版本的XHR能力非常有限,只支持文本传输,处理上传能力也不足,对于跨域请求也不支持。为解决这些问题,W3C于2008年发布了“XMLHttpRequest Level2”草案,新增了如下功能:
- 支持请求超时;
- 支持传输二进制和文本数据;
- 支持重写媒体类型和编码响应;
- 支持监控每个请求的进度事件;
- 支持有效的文件上传;
- 支持安全的跨来源请求。
2011年,W3C将“XMLHttpRequest Level2”规范与最初的“XMLHttpRequest”规范合并,所有XHR2新增的功能也都并入了原来的XHR API中,接口不变,功能增强。
1.XHR简介
XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,包括做出 POST 和 HEAD 请求以及普通的 GET 请求的能力。XMLHttpRequest 可以同步或异步地返回 Web 服务器的响应,并且能够以文本或者一个 DOM 文档的形式返回内容。XHR接口强制要求每个请求都具备严格的HTTP语义–应用提供数据和URL,浏览器格式化请求并管理每个连接的完整生命周期,所以XHR仅仅允许应用自定义一些HTTP首部,但更多的首部是不能自己设定的,如:
- Accept-Charset, Accept-Encoding, Access-Control-*
- Host, Upgrade, Connection, Referer, Origin
- Cookie, Sec-, Proxy-, 及其他首部
浏览器会拒绝绝对不安全的首部重写,以保证应用不能假扮用户代理、用户或请求来源,如Origin由浏览器自动设置,Access-Control-Allow-Origin由服务器设置,如果接受该请求,不包含该字段即可,浏览器发出的请求将作废。
- CORS请求会省略cookie和HTTP认证等用户凭据;
- 客户端被限制只能发送“简单的跨域请求”,包括只能使用GET POSD HEAD三种方式,只能访问通过XHR发送并读取的HTTP首部。
如果想要启用cookie和HTTP认证,客户端必须在发送请求时通过XHR对象发送额外的属性(withCredentials),而服务器也需要以Access-Control-Allow-Credentials响应,表示允许应用发送隐私数据。同样,如果客户需要写入或读取自定义HTTP标头或想要使用“非简单的方法”的请求,那么它必须首先通过发出一个预备请求,以获取第三方服务器的许可,如下所示:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// Preflight requestOPTIONS /resource.js HTTP/1.1Host: thirdparty.comOrigin: http://example.comAccess-Control-Request-Method: POSTAccess-Control-Request-Headers: My-Custom-Header...// Preflight responseHTTP/1.1 200 OKAccess-Control-Allow-Origin: http://example.comAccess-Control-Allow-Methods: GET, POST, PUTAccess-Control-Allow-Headers: My-Custom-Header...(actual HTTP request) |
W3C CORS规范定义的什么时候必须使用预备请求,“简单”的请求可以跳过它,但也有各种各样场景需要使用预备请求,这就添加一次往返网络延迟。可喜的是,一旦预备请求完成,它可以由客户端缓存,以避免在后续请求进行相同的验证。
在XHR中,可以通过responseType-设置改变响应类型,如下所示:
- “” 字符串(默认值)
- “arraybuffer” ArrayBuffer
- “blob” Blob
- “document” Document
- “json” JavaScript 对象,解析自服务器传递回来的JSON 字符串。
- “text” 字符串
2.数据传输
2.1.数据请求:
下面是通过XHR获取一张图片,并显示到网页上的示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
var xhr = new XMLHttpRequest();xhr.addEventListener("progress", updateProgress, false);xhr.addEventListener("load", transferComplete, false);xhr.addEventListener("error", transferFailed, false);xhr.addEventListener("abort", transferCanceled, false);xhr.open('GET', '/images/photo.webp');xhr.responseType = 'blob';xhr.onload = function() { if (this.status == 200) { var img = document.createElement('img'); img.src = window.URL.createObjectURL(this.response); img.onload = function() { window.URL.revokeObjectURL(this.src); } document.body.appendChild(img); }};xhr.send(); |
2.2.数据上传
上传相关事件在 XMLHttpRequest.upload 对象上被触发,像下面这样,向服务器发送一个formdata格式数据:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
var formData = new FormData();formData.append('id', 123456);formData.append('topic', 'performance');var xhr = new XMLHttpRequest();xhr.upload.addEventListener("progress", updateProgress);xhr.upload.addEventListener("load", transferComplete);xhr.upload.addEventListener("error", transferFailed);xhr.upload.addEventListener("abort", transferCanceled);xhr.open('POST', '/upload');xhr.onload = function() { ... };xhr.send(formData); |
2.3.数据分片上传:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
var blob = ...;const BYTES_PER_CHUNK = 1024 * 1024;const SIZE = blob.size;var start = 0;var end = BYTES_PER_CHUNK;while(start < SIZE) { var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload'); xhr.onload = function() { ... }; xhr.setRequestHeader('Content-Range', start+'-'+end+'/'+SIZE); xhr.send(blob.slice(start, end)); start = end; end = start + BYTES_PER_CHUNK;} |
注意:progress 事件在使用 file: 协议的情况下是无效的。
end
script ajax / XHR / XMLHttpRequest的更多相关文章
- Ajax笔记 XHR XMLHttpRequest
XMLHttpRequest xhr XmlHttpRequest var request ; if(Windows.XMLHttpRequest) { request ...
- 原生Ajax(XMLHttpRequest)
一.什么是Ajax: 全称Asynchronous JavaScript and XML: 异步的 JavaScript 和 XML: 可以在不重新加载整个页面的情况下(偷偷发数据),与服务器交换数据 ...
- AJAX(XMLHttpRequest)进行跨域请求方法详解
AJAX(XMLHttpRequest)进行跨域请求方法详解(三) 2010年01月11日 08:48:00 阅读数:24213 注意:以下代码请在Firefox 3.5.Chrome 3.0.Saf ...
- 原生ajax、XMLHttpRequest和FetchAPI简单描述
什么是ajax ajax的出现,刚好解决了传统方法的缺陷.AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个 ...
- ajax - xhr level2新特性 json等众多内容
1. 今天的内容其实挺多的,我们慢慢来说.首先第一个是xhr的基本使用,什么是xhr? XMLHTTPRequest是浏览器提供的js对象,可以请求服务器上的数据资源,包括我们前面一直用的jq里面的三 ...
- AJAX初探,XMLHttpRequest介绍
AJAX初探,XMLHttpRequest介绍 AJAX AJAX = Asynchronous JavaScript and XML. 异步的JavaScript和XML. AJ ...
- Egret和Http请求 (Ajax、XMLHttpRequest、Post、Get)
一 Http请求 二 AJax和XMLHttpRequest 三 一个Ajax例子 四 Egret中的egret.HttpRequest 五 Post和Get区别 一 Http请求 Http深入 ...
- js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可)
js进阶ajax的XMLHttpRequest对象的status和statustext属性(如果ajax和php联合使用的话:open连接服务器的第二个参数文件路径改成请求php的url即可) 一.总 ...
- 原生实现ajax解析--XMLHttpRequest
ajax基础: Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求. 如果仔细观察一个Form的提交,你就会发现,一旦用户点击“Submit ...
随机推荐
- css溢出显示省略号
单行溢出省略号 .show-detail li .info-name { width:278px; display:inline-block; /*下面是重点*/ overflow: hidden; ...
- Codeforces Round #426 Div. 1
A:考虑每个质因子,显然要求次数之和是3的倍数,且次数之差的两倍不小于较小的次数.对于第一个要求,乘起来看开三次方是否是整数即可.第二个取gcd,两个数分别除掉gcd,之后看两个数的剩余部分是否都能被 ...
- Codeforces Round #543 (Div. 2, based on Technocup 2019 Final Round)
A. Technogoblet of Fire 题意:n个人分别属于m个不同的学校 每个学校的最强者能够选中 黑客要使 k个他选中的可以稳被选 所以就为这k个人伪造学校 问最小需要伪造多少个 思路:记 ...
- P1508 Likecloud-吃、吃、吃
数字金字塔3条路 f[i][j]=max(max(f[i-1][j],f[i-1][j-1]),f[i-1][j+1])+a[i][j]; #include<bits/stdc++.h> ...
- 洛谷P1209修理牛棚题解
题目 这个题一眼看上去是一个贪心,但是一个贪心题就一定要用一个贪心的做法来做吗,为什么不能写一个DP呢,这个题我们可以从他修理牛棚的角度来看,价值就是一个木板可以修几个,但是也同时消耗掉了一个木板的长 ...
- Django+Vue打造购物网站(一)
环境搭建 python == 3.6 Django == 2.0 创建工程 django-admin startproject MxShop 配置setting.py文件 # 数据库 DATABASE ...
- 【BZOJ3625】【CF438E】小朋友和二叉树 NTT 生成函数 多项式开根 多项式求逆
题目大意 考虑一个含有\(n\)个互异正整数的序列\(c_1,c_2,\ldots ,c_n\).如果一棵带点权的有根二叉树满足其所有顶点的权值都在集合\(\{c_1,c_2,\ldots ,c_n\ ...
- 洛谷P4581 [BJOI2014]想法(玄学算法,拓扑排序)
洛谷题目传送门 萝卜大毒瘤 题意可以简化成这样:给一个DAG,求每个点能够从多少个入度为\(0\)的点到达(记为\(k\)). 一个随机做法:给每个入度为\(0\)的点随机一个权值,在DAG上求出每个 ...
- 【Loj116】有源汇有上下界最大流(网络流)
[Loj116]有源汇有上下界最大流(网络流) 题面 Loj 题解 模板题. #include<iostream> #include<cstdio> #include<c ...
- django后台密码错误
如果你忘记了设置Django的Admin密码,那么你可以使用createsuperuser来甚至密码,但是如果你忘记了Admin的密码的话,那么就要用Django shell: 1 python ma ...