1、HTTP 状态消息 200 302 304 403 404 500
- 200:请求已成功,请求所希望的响应头或数据体将随此响应返回
- 302:请求的资源临时从不同的 URL 响应请求.由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求,只有在Cache-Control 或 Expires 中进行了指定的情况下,这个响应才是可缓存的.
- 304:如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次一来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码.304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾.
- 403:服务器已经理解请求,但是拒绝执行它.
- 404:请求失败,请求所希望得到的资源未被在在服务器上发现.
- 500:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理.一般来说,这个问题都会在服务器端的源代码出现 错误时出现.
2、AJAX
Ajax 的原理简单来说通过 XmlHttpRequest 对象来向服务器发异步请求,可以让网站跟服务器交互的一种技术,能在我们需要时,不用再刷新网页就能去服务器要一些数据回来。
- 同步:在进行一件事的处理的时候,是从头到尾,中间没有被中断。
- 异步:在做一件事件的时候,可以让另一件同时在做。
Ajax的实现步骤
- 创建异步对象,XMLHTTPRequest实例(浏览器的内置对象)
- 初始化请求对象,post请求需要设置请求头
- 监听异步对象的状态变更
- 发送请求,根据需求传参
- 判断数据获取的成功状态
- 成功获取数据,处理渲染数据
get请求
<script>
// 1. new一个异步对象 XMLHttpRequest
var xhr = new XMLHttpRequest();
// 2. 初始化(设置请求的数据)
xhr.open('get','http://127.0.0.1:3001/getUserNameAjax'+'?userId=4');
// var data = 'userId=3'
// 3. 发生请求
// xhr.send();
xhr.send(null);
// 4. 监听响应
xhr.onreadystatechange = function() {
// 5. 判断状态和数据是否传输完成
if(xhr.status == 200 && xhr.readyState == 4){
// 服务器响应回来的数据存在:responseText
var res = JSON.parse(xhr.responseText);
console.log(res);
// 6. 获得响应数据,在浏览器渲染
var userDom = document.querySelector('#user');
userDom.innerHTML = '我叫'+res.data.name+',今年'+res.data.age+'岁'
}
}
</script>
post请求
// 给按钮绑定点击事件
btn.onclick = function() {
var userName = userInput.value;
var userPwd = pwdInput.value;
// 发送请求,注册用户
// 1. 创建一个异步对象
var xhr = new XMLHttpRequest();
// 2.初始化
xhr.open('post','http://127.0.0.1:3001/register');
// 对于post请求一定要设置请求头
// xhr.setRequestHeader(key value);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// 监听响应
xhr.onreadystatechange = function() {
// 判断是否完成
if(xhr.status == 200 && xhr.readyState == 4) {
console.log(res);
// 获取的数据是一个字符串形式的json数据,需要转换为对象
var res = JSON.parse(xhr.responseText);
tips.innerHTML = res.msg;
}
}
// 获取数据
var data = 'userName='+userName+'&userPwd='+userPwd+'';
// 对于post请求如果有数据必须使用send来发送数据
xhr.send(data);
}
3、GET请求和POST请求的异同
相同点:
- 创建异步对象
- 都需要初始化
- 都需要发送数据
- 都需要监听发送的状态
不同点:
- 请求方式不同
- post请求的参数是通过send方法来发送,get请求的参数拼接在url地址栏后面
- post请求一定要设置请求头部
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
4、jQuery中的简易的ajax方法
- get
$.ajax({
type: 'get',
url: 'http://127.0.0.1:3001/validate',
data: {
userName: userName
},
dataType: 'json',
success: function (res) {
// 使用jQuery的ajax方法的时候,返回的JSON数据已经帮我们转换成了对象
console.log(res);
}
});
- post
// 给按钮注册点击事件
btn.onclick = function () {
$.ajax({
type: 'post',
url: 'http://127.0.0.1:3001/register',
data: {
userName: userInput.value,
userPwd: pwdInput.value
},
dataType: 'json',
success: function(res){
// console.log(res);
tips.innerHTML = res.msg;
}
})
}
5、请求拦截与超时处理
beforeSend 传入一个函数可以在请求发送之前(相当于原生的 xhr.send 方法之前)进行操作,一般是进行用户输入数据的验证,如果有问题,return false 即可马上停止请求发送。
btn.onclick = function () {
$.ajax({
type: 'post',
url: 'http://127.0.0.1:3001/register',
data: {
userName: userInput.value,
userPwd: pwdInput.value
},
dataType: 'json',
// jQuery中给我们提供的一个拦截器,当数据在发送之前做拦截,如果判断数据有问题,我们可以不让发送
beforeSend: function () {
if (!userInput.value) {
// console.log('亲,请输入用户名哦');
tips.innerHTML = '你不要名字的吗?想搞事吗?'
return false;
}
},
// 设置超时时间 设置一个时间点,只要超过了这个时间点,我们做一个处理,用来提示用户
timeout: 3000,
// 如果超时了,给用户一个反馈
error: function() {
tips.innerHTML = "亲,服务器太累了,要休息一下";
},
success: function (res) {
// console.log(res);
tips.innerHTML = res.msg;
}
})
}
6、表单序列化
// jQuery中的表单序列化 一次性整体的将整个表单的数据获取过来
// 特别是当表单中的表单项特别多的时候,使用表单序列化会更加的方便,快捷
var data1 = $('#form').serialize();
7、模板引擎 art-template
<!-- 第一步:引入模板引擎文件 -->
<script src="../assets/js/template.js"></script>
<!-- 第二步: 准备模板 -->
<script type="text/html" id="list">
{{each data}}
<tr>
<td>{{$value.id}}</td>
<td>{{$value.name}}</td>
<td>{{$value.age}}</td>
{{if $value.gender == '男'}}
<td>小哥哥</td>
{{else}}
<td>渣女</td>
{{/if}}
<td>{{$value.zhuanye}}</td>
<td>{{$value.address}}</td>
</tr>
{{/each}}
</script>
<!--第三步渲染-->
btn.onclick = function() {
// 点击的时候要发ajax请求获取学生列表数据
$.get({
url:'http://127.0.0.1:3001/getStudentsJSON',
dataType: 'json',
success: function(res) {
var htmlStr = template('list',res);
// console.log(htmlStr);
document.querySelector('#tbody').innerHTML = htmlStr;
}
})
}
- 拼接字符串
${obj.name}
- 模板字符串
`<tr>
<td> ${res.data.id}</td>
<td> ${res.data.name}</td>
<td> ${res.data.age}</td>
</tr>
`
- 原生写法
<script type="text/html" id="list">
<% for(var index in data) { %>
<tr>
<td><%= data[index].id%></td>
<td><%= data[index].name%></td>
<td><%= data[index].age%></td>
<%if(data[index].gender == '男') {%>
<td>小哥哥</td>
<% } else{ %>
<td>小妹妹</td>
<% } %>
<td><%= data[index].zhuanye%></td>
<td><%= data[index].address%></td>
</tr>
<% } %>
</script>
8、逻辑运算符
- a && b 逻辑与(AND),两个表达式皆为真则为 true,只要一个假,与运算为 false(找假)
- a || b 逻辑或(OR) , 两个表达式只要一个为真,则或运算为 true (找真)
9、封装AJAX
var $$ = {
ajax: function (ajaxObj) {
var type = ajaxObj.type;
var url = ajaxObj.url;
var data = ajaxObj.data;
var dataType = ajaxObj.dataType;
var success = ajaxObj.success;
var xhr = new XMLHttpRequest();
// console.log(this);
// data = 'userid=2&userxx=1223'
// 将对象转换为字符串
data = this.obj2str(data);
// 做type的大小写兼容,将用户传进来的type值的统一转换为小写 JSON
type = type.toLowerCase();
// 将接收返回的数据类型统一转换为小写
dataType = dataType.toLowerCase();
// 给一些参数做默认值设置
type = type || 'get';
url = url || '';
data = data || {};
dataType = dataType || 'json';
if (type == 'get' && data) {
url = url + '?' + data;
}
xhr.open(type, url);
if (type == 'post') {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
xhr.onreadystatechange = function () {
if (xhr.status == 200 && xhr.readyState == 4) {
var res;
if (dataType == 'json') {
res = JSON.parse(xhr.responseText);
} else if (dataType == 'xml') {
res = xhr.responseXML;
} else {
res = '你参数的接收数据类型不对,搞事情吗?'
}
success(res);
}
}
if (type == 'get') {
xhr.send(null);
}
if (type == 'post') {
xhr.send(data);
}
}
}
10、FormData
formData对象将表单数据转换为二进制,只能在js上,不能jQuery,不要设置请求头,不要编码
var uploadImg = document.querySelector('#uploadImg');
// 在这里有一个onchange的方式可以用来处理我们上传
uploadImg.onchange = function() {
// console.log(this);
// console.dir(this);
var data = new FormData();
data.append('avatar',this.files[0]);
// 发送ajax请求
$.post({
url: 'http://127.0.0.1:3001/uploadFile',
dataType: 'json',
data: data,
// 因为将数据转换成了二进制所以不需要设置请求头
contentType: false,
// 不需要再进行编码
processData: false,
success: function (res) {
// console.log(res);
$('img').attr('src',res.src);
}
})
}