ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AJAX的请求方式

2022-04-02 15:00:32  阅读:156  来源: 互联网

标签:function http 请求 方式 xhr AJAX response


目录

AJAX

AJAX简介

AJAX全称为Asynchronous JavaScript And XML,就是异步的 JS 和 XML。
通过AJAX可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。AJAX不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。

XML简介

XML可扩展标记语言。
XML被设计用来传输和存储数据。
XML和 HTML类似,不同的是HTML中都是预定义标签,而xML中没有预定义标签,全都是自定义标签,用来表示一些数据。

比如说我有一个学生数据:
name ="孙悟空"; age= 18 ; gender = "男";
用XML表示:
<student>
    <name>孙悟空</name>
    <age>18</age>
    <gender>男</gender>
</student>

AJAX的特点

AJAX的优点

可以无需刷新页面而与服务器端进行通信。

允许你根据用户事件来更新部分页面内容。

AJAX的缺点

没有浏览历史,不能回退

存在跨域问题(同源)

SEO 不友好

AJAX的使用

HTTP

HTTP (hypertext transport protocol)协议『超文本传输协议』,协议详细规定了浏览器和万维网服务器之间互相通信的规则。

请求报文

重点是格式与参数

行    POST     /s?ie=utf-8  HTTP/1.1
头    Host: atguigu.com
      Cookie: name=guigu
      Content-type: application/x-www-form-urlencoded
      User-Agent: chrome 83
空行      
体      username=admin&password=admin

响应报文

行    HTTP/1.1 280 oK
头    Content-Type: text/html; charset=utf-8
      Content-length: 2048
      Content-encoding: gzip
空行
体      <html>
            <head></head>
            body>
            <h1>苏槿年</h1>
            </body>
        </html> 

引入express

//1.引入express
const express = require( 'express' );

//2.创建应用对象
const app = express();

//3.创建路由规则
// request是对请求报文的封装
// response是对响应报文的封装
app.get( '/server ' , (request, response)=>{
    //设置响应头设置允许跨域
    response. setHeader( ' Access-Control-Allow-Origin', '*');
    //设置响应体
    response.send( 'HELLO AJAX');
});
//4.监听端口启动服务
app.listen( 8000,()=>{
console.log("服务已经启动,8000端口监听中....");
});

AJAX请求格式

GET请求

//绑定事件
btn.onclick = function(){
    //1.创建对象
    const xhr = new XMLHttpRequest();
    //2.初始化设置请求方法和url
    xhr.open( ' GET', "http://127.0.0.1 :8000/server' );
     //3.发送
    xhr.send();
    //4.事件绑定处理服务端返回的结果
    // on when当....时候
    // readystate  是 xhr对象中的属性,表示状态日1 2 3 4
    // change  改变
    xhr.onreadystatechange = function(){
        //判断(服务端返回了所有的结果)
        if(xhr.readyState === 4){
        //判断响应状态码200 404 403 401 500
        // 2xx 成功
        if(xhr.status >= 200 && xhr.status < 300){
            //处理结果  行  头  空行  体
            //响应
            // console.log(xhr.status);//状态码
            // console.log(xhr.statusText);//状态字符串
            // console.log(xhr.getAllResponseHeaders());//所有响应头
            // console.log(xhr.response);//响应体
            
            //设置result的文本
            result.innerHTML = xhr.response;
        }else{
            
        }
    }
}

POST请求

//获取元素对象
const result = document.getElementById( "result");
//绑定事件
result.addEventListener( "mouseover", function(){
    //1.创建对象
    const xhr = new XMLHttpRequest();
    //2.初始化设置类型与URL
    xhr.open( 'POST', 'http://127.0.0.1:8000/server');
    //设置请求头
    xhr.setRequestHeader('Content-Type' , 'application/x-www-form-urlencoded')
    xhr.setRequestHeader( ' name ' , 'sujinnian');

    //3.发送
    xhr.send('a=100&b=200&c=300');//请求体,请求数据,任意格式,任何形式
    //xhr.send('a:100&b:200&c:300');
    //xhr.send('123456');
    //4.事件绑定
    xhr.onreadystatechange = function(){
        //判断
        if(xhr.readyState == 4){
            if(xhr.status >= 200 && xhr.status < 300){
            //处理服务端返回的结果
            result.innerHTML = xhr.response;
            }
        }
    }
});

服务端响应JSON数据

//绑定事件
btn.onclick = function(){
    //1.创建对象
    const xhr = new XMLHttpRequest();
    //2.初始化设置请求方法和url
    xhr.open( ' GET', "http://127.0.0.1 :8000/server' );
     //3.发送
    xhr.send();
    //4.事件绑定处理服务端返回的结果
    xhr.onreadystatechange = function(){
        if(xhr.readyState === 4){
        if(xhr.status >= 200 && xhr.status < 300){
            //console.log(xhr.response);
            //result.innerHTML = xhr.response;
            //手动对数据转化
            //let data = JSON.parse(xhr.response);
            //console.log(data);
            //result.innerHTML = data.name;
            //自动转换
            console.log(xhr.response);
            result.innerHTML = xhr.response;
        }
    }
}

AJAX请求超时与网络错误

//绑定事件
btn.onclick = function(){
    const xhr = new XMLHttpRequest();
    //超时设置2s 设置
    xhr.timeout = 2000;
    //超时回调
    xhr.ontimeout = function(){
        alert("网络异常,请稍后重试!!");
    }
    //网路异常回调
    xhr.onerror = function(){
        alert("你的网络似乎出了一些问题!")
    }
    xhr.open('GET', "http://127.0.0.1 :8000/server' );
     //3.发送
    xhr.send();

    xhr.onreadystatechange = function(){
        if(xhr.readyState === 4){
        if(xhr.status >= 200 && xhr.status < 300){
            result.innerHTML = xhr.response;
        }
    }
}

AJAX请求取消

//获取元素对象
const btns = document.querySelectorAl1 ( ' button ' );
let x = null;

btns[e].onclick = function(){
        x = new XMLHttpRequest();
        x.open( "GET", "http://127.0.0.1:8000/delay");
        x.send();
}
// abort;请求取消
btns[1].onclick = function(){
x.abort();
}

AJAX请求重复发送问题

//获取元素对象
const btns = document.querySelectorAl1("button");
let x = null;
//标识变量
let issending = false;//是否正在发送AJAX请求
btns[e].onclick = function(){
    //判断标识变量
    if(isSending) x.abort();// 如果正在发送,则取消该请求,创建一个新的请求
    x=new XMLHttpRequest();
    //修改标识变量的值
    isSending = true;
    x.open("GET", 'http://127.0.0.1:8000/delay');
    x.send();
    x.onreadystatechange = function(){
        if(x.readyState ===4){
        //修改标识变量
            isSending = false;
        }
    }
}

jQuery中的AJAX

<div class="container">
    <h2 class="page-header">jQuery发送AJAX请求</h2>
    <button class="btn btn-primary" >GET</button>
    <button class="btn btn-danger " >POST</button>
    <button class="btn btn-info">通用型方法ajax</button>
</div>
<script>
    //$.get('url',{参数},方法,数据类型)
$('button').eq(0).click(function(){
    $.get('http://127.0.0.1:8000/jquery-server' , {a:100, b:200},function(data){
        console.log(data);
    },'json');
})
$('button').eq(1).click(function(){
    $.post('http://127.0.0.1:8000/jquery-server', {a:100, b:200},function(data){
        console.log(data);
    });
})
</script>

通用方法

$.ajax({
    //url
    url:'http://127.0.0.1:8080/jquery-server',
    //参数
    data: {a: 100, b:200},
    //请求类型
    type:'GET',
    //响应体结果
    dataType:'json',
    //成功的回调
    success: function(data){
        console.log(data);
    },
    //超时时间
    timeout: 2000,
    //失败的回调
    error: function(){
    console.log('出错啦!!');
    },
    //头信息
    headers:{
        c:300,
        d:400
    }
})

Axios发送AJAX请求

const btns = document.querySelectorA11('button');
//配置baseURL
axios.defaults.baseURL = 'http://127.0.0.1:8080';
btns[0].onclick = function(){
    //GET 请求
    axios.get('/axios-server' , {
        // url参数
        params: {
            id:100,
            vip:7
        },
        //请求头信息
        headers: {
            name:'sujinnian',
            age: 20
        }
    }).then(value => {
        console.log(value);
    })
}

fetch函数发送AJAX请求

const btn = document.querySelector('button');
btn.onclick = function(){
fetch('http://127.0.0.1:8000/fetch-server?vip=10', {
    //请求方法
    method: "POST',
        //请求头
    headers:{
    name:'sujinnian'
    },
    //请求体
    body:'username=admin&password=admin'
}).then(response => {
// return response.text();
    return response.json();
}).then(response=>{
console.log(response);
});
}

跨域

同源策略

同源:协议、域名、端口号 必须完全相同。
违背同源策略就是跨域。

如何解决跨域

JSONP

  • JSONP是什么

JSONP(JSON with Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明才智开发出来,只支持get请求。

  • JSONP怎么工作的?

在网页有一些标签天生具有跨域能力,比如: img link iframe script。JSONP就是利用script标签的跨域能力来发送请求的。

  • JSONP的使用

1.动态的创建一个script标签
var script = document.cteateElement("script");

2设置script的src,设置回调函数
script.src = "http://localhost:3000/testAlAX?callback=abg";

原生jsonp的实现

//获取input元素
const input = document.querySelector('input');
const p = document.querySelector('p');
//声明 handle 函数
function handle(data){
    input.style.border = "solid 1px #f00";
    //修改p标签的提示文本
    p.innerHTML = data.msg;
}
//绑定事件
input.onblur = function(){
    //获取用户的输入值
    let username = this.value;
    //向服务器端发送请求检测用户名是否存在
    //1.创建script标签
    const script = document.createElement('script');
    //2.设置标签的src属性
    script.src = 'http://127.0.0.1:8000/check-username';
    //3.将script插入到文档中
    document.body.appendChild(script);
}

jQuery发送jsonp请求

$('button').eq(0).click(function(){
    $.getJsoN('http://127.0.0.1:8000/jquery-jsonp-server?callback=?', function(data){
        $('#result').html(`
              //data属性
          `)
      });
}

CORS

CORS是什么?

CORS(Cross-Origin Resource Sharing),跨域资源共享。CORS是官方的跨域解决方案,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持get和 post 请求。跨域资源共享标准新增了一组HTTP首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源

CORS 怎么工作的?

CORS是通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应以后就会对响应放行。

CORS的使用

请求方式使用下列方法之一:

  • GET
  • HEAD
  • POST

HTTP Headers 匹配下面的

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type, 但值是其中的一种:
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

HTTP请求

POST /cors HTTP/1.1
Origin:http://api.bob.com
Host: api.bob.com

有效的服务器CORS响应:

Access-Control-Allow-Origin: http://api.bob.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8

CORS字段介绍:
(1)Access-Control-Allow-Methods

该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。

(2)Access-Control-Allow-Headers

如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。

(3)Access-Control-Allow-Credentials

该字段与简单请求时的含义相同。

(4)Access-Control-Max-Age

该字段可选,用来指定本次预检请求的有效期,单位为秒。上面结果中,有效期是20天(1728000秒),即允许缓存该条回应1728000秒(即20天),在此期间,不用发出另一条预检请求。

标签:function,http,请求,方式,xhr,AJAX,response
来源: https://www.cnblogs.com/wzx-blog/p/16092115.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有