题目
手写一个简易的ajax
function ajax(url){
const p = new Promise((reslove,reject) => {
const xhr =new XMLHttpRequest()
xhr.open('GET','url',true)
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
if(xhr.status === 200){
reslove(
JSON.pase(xhr.responseText)
)
}else if(xhr.status === 404){
reject(
new Error("404 not found")
)
}
}
}
xhr.send(null)
})
return p
}
ajax(url)
.then(
res=>{console.log}
).catch(err => {
console.log(err)
})
跨域的常用实现方式
知识点
XMLHttpRequest
const xhr = XMLHttpRequest()
xhr.open('GET','url',true)
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
if(xhe.status ====200){
console.log(JSON.Parse(xhr.responseText))
}else {
console.log("其他情况")
}
}
}
xhr.send(null)
const xhr = new XMLHttpRequest()
xhr.open('POST','url',true)
xhr.onreadystatechange = function(){
if(xhr.readyState ===4){
if(xhr.status===200){
JSON.parse(xhr.responseText)
}else{
console.log("其他情况")
}
}
}
const postData = {
userName = 'zhangsan',
password:'xxx'
}
xhr.send(JSON.stringify(postData))
状态码
xhr.readyState
- 0 -(未初始化) 还没有调用send()方法
- 1 -(载入) 已调用send() 方法,正在发送请求
- 2 -(载入完成) send()方法执行完成,已经接收到全部相应内容
- 3 -(交互) 正在解析响应内容
- 4 -(完成) 响应内容解析完成,可以在客户端调用了
xhr.status
- 2xx - 表示成功除理请求 如200
- 3xx - 需要重定向,浏览器直接跳转,如301 302 304
- 4xx - 客户端请求错误, 如404
- 5xx - 服务器端错误 如500 501 502
跨域:同源策略,跨域解决方案
同源策略
- ajax请求时,浏览器要求当前网页和server必需同源
- 同源:协议、域名、端口必需一致
- 前端:
http://a.com:8080;server:https:b.com/api/xxx
加载图片css js 可无视同源策略
<img src=xxx>
<link href=xxxx>
<script src=xxxx>
用途
- img可用于打点统计,统计网站可能是其他域,如百度站长
- link和script标签可以使用CDN,CDN的也是其他域
- script标签可以用于JSONP
跨域
- 所有跨域请求都必需经过信息提供方允许
- 如果未经允许即可获取,那是浏览器同源策略出现漏洞
JSONP
原理
- 加载URL请求时不一定服务器真正有一个相应的文件。服务器可以根据请求,动态生成一个文件返回,只要其符合html格式要求。这点同样适用于js请求
- script 可以绕过跨域数据限制,服务器可以任意动态拼接数据返回。所以,script就可以获取跨域数据,只要服务端支持
代码
<script>
window.callback = function (data) {
console.log(data)
}
</script>
<script src="https://xxx.com/api.js">
服务器端设置 http header
- 另外一个解决跨域的简洁方法,需要服务器端来做
- 但是作为交互方,前端必须知道这个方法
- 是将来解决跨域问题的一个趋势
如kor2-cors
response.setHeader("Access-Control-Allow-Orgin", "http://a.com,http://b.com")
response.setHeader("Access-Control-Allow-Header", "X-Requested-With");
response.setHeader("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
response.setHeader('Access-Control-Allow-Credentials','true');
实际常用的插件: