http常见状态码解析

时间:2021-03-22 13:15:32
自定义 Ajax原生编写
ajax:function(opt){
var xmlhttp;
//创建对象
if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}else{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
} //请求类型 默认post
opt.type = opt.type ? opt.type.toUpperCase() : '';
var reqType = opt.type === 'GET' ? 'GET' : 'POST'; /*
*防止使用时直接加了尾参 需要解析 ? 拼接参数 并区别get和post
*get 需要将参数全部拼接在url后; post将参数全部拼接在seng方法里
*get获取时防止缓存 添加随机数
*/
if(!opt.url){
throw new Error("please input url");
}
var getUrlArr = opt.url.split('?');
//请求地址一定是第一个
var setUrl = getUrlArr[0];
var setArguments = '';
//个数超过2 解析 arguments
if(getUrlArr.length > 1){
for(var i = 1; i< getUrlArr.length; i++ ){
setArguments += '&'+getUrlArr[i];
}
}
var userData = opt.data ? opt.data : '';
var userArguments = '';
if(userData){
for (var x in userData){
userArguments += '&'+x+'='+userData[x];
}
}
//拼接 url之后的和data里的参数
setArguments += userArguments;
//状态监测
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState == 4 ){
if(xmlhttp.status == 200){
try {
opt.success(JSON.parse(xmlhttp.responseText));
}catch(e){
opt.success(xmlhttp.responseText);
}
}else{
if(typeof opt.error == 'function'){
opt.error(xmlhttp.status);
}
}
}
} //默认异步 完整的后期编写
if(reqType === 'GET'){
xmlhttp.open(reqType,setUrl+'?t='+ Math.random()+setArguments,true);
xmlhttp.send();
}else{
setArguments = setArguments ? setArguments.substring(1) : '';
xmlhttp.open(reqType,setUrl,true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded; charset=utf-8");
xmlhttp.send(setArguments);
}
return xmlhttp;
}
xmlhttp.readyState
0 请求未初始化(还没有调用 open()
1 请求已经建立,但是还没有发送(还没有调用 send()
2 请求已发送,正在处理中(通常现在可以从响应中获取内容头)
3 请求在处理中;通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。
4 响应已完成;您可以获取并使用服务器的响应了。
xmlhttp.status
200 请求已成功,请求所希望的响应头或数据体将随此响应返回。

301 永久重定向,新的永久性的 URI 应当在响应的 Location 域中返回,浏览器会根据这个新的URI去请求.
如果这不是一个 GET 或者 HEAD 请求,浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。
注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的 POST 请求得到了一个301响应的话,接下来的重定向请求将会变成 GET 方式。 302 请求的资源现在临时从不同的 URI 响应请求,常作为临时域名更替时的重定向,新的临时性的 URI 应当在响应的 Location 域中返回.
除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。
注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,
并且使用 GET 方式访问在 Location 中规定的 URI,而无视原先请求的方法。
状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。
PS 一个暂时重定向是一种服务器端的重定向,能够被搜索引擎蜘蛛正确地处理,(302 重定向和网址劫持)
302重定向很容易被搜索引擎误认为是利用多个域名指向同一网站,那么你的网站就会被封掉,
罪名是“利用重复的内容来干扰Google搜索结果的网站排名”。因为302重定向经常被用于做url劫持,黑帽seo技术中,
而且百度在处理302重定向技术还不成熟,经常将它纳入到黑帽seo的范畴中,而google对这方面识别处理就完善了许多。
所以302重定向在现阶段的搜索引擎技术中,还是容易导致网站降权的,尽量不用。但从seo、网站优化方面来说是弊大于利。 304 客户端向服务器发送了请求,服务器如果通过发送的请求头信息进行资源对比,如果资源没有发生变化,则让浏览器继续使用上次
发送的资源,浏览器会缓存上次的资源,这时候状态码304就是告诉浏览器读缓存,如果资源更新,服务器就会返回200,返回新的资源,
浏览器接受到之后也会更新本地的资源时间戳,下次请求时会发送新的请求头。 400 客户端请求有误 403 服务器已经理解请求,但是拒绝执行它。如果这不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,
那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个404响应,假如它不希望让客户端获得任何信息。 404 请求失败,请求所希望得到的资源未被在服务器上发现 500 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。 502 错误网关 503 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,
那么客户端应当以处理500响应的方式处理它。   
注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接。 504 作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。   
注意:某些代理服务器在DNS查询超时时会返回400或者500错误