前后端如何交互
- form表单提交(会跳转刷新页面,单向提交)
- ajax(不需要刷新页面)
- websocket
ajax
(Asynchronous JavaScript and XML),ajax就是用js向服务器端发起一个请求,并获取服务器返回内容。
其中最核心的依赖是浏览器提供的
XMLHttpRequest对象,是这个对象使得浏览器可以发出HTTP请求与接收HTTP响应。
主要特性:异步
实现在页面不刷新的情况下发送请求给服务器。- 接收被使用服务器发来的数据。
与之前请求方式不同点:页面没有刷新
属性
readyState
返回XMLHttpRequest代理当前所处的状态
| 值 | 状态 | 描述 |
|---|---|---|
| 0 | UNSENT | 代理被创建,但未调用open()方法 |
| 1 | OPENED | open()方法已被调用了,可以通过setRequestHeader()方法来设置请求的头部,可以调用send()方法来发起请求 |
| 2 | HEADERS_RECEIVED | send()方法已被调用,头部和状态已可获得 |
| 3 | LOADING | 下载中, responseText属性已包含部分数据 |
| 4 | DONE | 下载操作已完成 |
onreadystatechange
readyState属性发生变化时触发readystatechange事件的时候被调用。
response
返回响应的正文。
responseText
在一个请求被发送后,从服务器返回文本
readyState == 4 且 status == 200时,responseText是全部后端的返回数据
status
返回了XMLHttpRequest响应中的数字状态码
方法
open()
初始化一个请求
XMLHttpRequest.open(method,url,async)
setRequestHeader()
Http请求头部信息
send()
发送Http请求
XMLHttpRequest.send()
请求方式为POST时,不可为空
不需要发送任何值时
XMLHttpRequest.send(null)
getRequestHeader()
获取头部信息
abort()
取消异步请求
事件
load
一个XMLHttpRequest请求完成的时候会触发load事件
步骤
- 创建一个对象
var xhr = new XMLHttpRequest();
- 确定请求方式
xhr.open('POST','https://cnodejs.org/api/v1/topics',true)
- 发送请求
xhr.send(data)
- 处理响应,监听请求成功后的状态变化
//设置onreadystatechange的回调函数
request.onreadystatechange = function() {
//readyState是交互流程有没有结束
//readyState == 4判断请求是否完成,status == 200再判断是否是一个成功的响应
if(this.readyState == 4 && this.status == 200) {
console.log(request.responseText);
}
}
//responseText就是服务器返回内容
//load是当readState == 4 的时候会自动触发load
//这样用表示状态为4了
xhr.addEventListener('load',function(){
// 200~300之间都是成功的只是状态不同,304是数据缓存状态
if((xhr.readyState == 4)&&(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304 )){
console.log(xhr.responseText);
}else {
console.log('服务器异常')
}
})
- 发送请求
send()发送请求,GET请求不需要参数,POST请求需要把body部分以字符串或者FormData对象传进去。
request.send()
jQuery.ajax对以上4步进行了封装
$.get('filename').then(function(reponse){
//这里是response要返回的内容
})
ajax请求
目前最常用的是json格式
$.get('filename').then(function(reponse){
{"name" : "Jane" }
})
封装一个ajax函数
//
function ajax(opts){
var url = opts.url
var type = opts.type || 'GET'
var dataType = opts.dataType || 'json'
var success = opts.success || function(){}
var error = opts.error || function(){}
var data = opts.data || {}
var dataStr = []
for(var key in data){
dataStr.push( data[key])
}
var xhr = new XMLHttpRequest()
if(type === 'GET'){
xhr.open(type,url + '/' + dataStr,true)
xhr.send()
}else if(type === 'POST'){
xhr.open(type, url, true)
xhr.send(dataStr)
}
xhr.onload = function(){
if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
//成功了
if(dataType === 'json'){
success( JSON.parse(xhr.responseText))
console.log(url)
}else{
success( xhr.responseText)
}
} else {
error()
}
}
}
ajax({
type: 'GET',
url: 'https://cnodejs.org/api/v1/topics',
data: {
id: "5433d5e4e737cbe96dcef312",
},
success: function(ret){
console.log(ret)
},
error: function(){
console.log('服务器异常')
}
})
搭建服务器
http-server
启动静态服务器。
server-mock
使用server-mock node启动一个能处理静态文件和动态路由的服务器。
线上mock
- 使用 easy-mock.com/
- 使用 rapapi.org/org/index.d…
- 使用 server-mock