Twlig / issuesBlog

MIT License
3 stars 0 forks source link

Ajax #22

Open Twlig opened 2 years ago

Twlig commented 2 years ago

Ajax(Asynchronous JavaScript+XML,即异步 JavaScript 加 XML)技术,这个技术涉及发送服务器请求额外数据而不刷新页面,只是更新局部页面,从而实现更好的用户体验。

把 Ajax 推到历史舞台上的关键技术是 XMLHttpRequest(XHR)对象,它为开发者提供了原生的浏览器通信能力。XHR 为发送服务器请求和获取响应提供了合理的接口。这个接口可以实现异步从服务器获取额外数据,意味着用户点击不用页面刷新也可以获取数据。通过 XHR 对象获取数据后,可以使用 DOM 方法把数据插入网页。

Ajax请求流程

Twlig commented 2 years ago

Content-Type请求头常见值

  1. x-www-form-urlencoded

    • 是表单提交的一种,以x-www-form-urlencoded方式提交数据,会将表单内的数据转换为键值对

    • 查询参数的形式,如get请求url中?号后面的查询参数

      https://books.com?bookClass=10&year=2020
  2. multipart/form-data。 也是一种表单提交,以multipart/form-data方式提交数据,是使用包含文件上传控件的表单。

  3. application/json

    请求体数据采用json格式

Twlig commented 2 years ago

XMLHttpRequest.response和XMLHttpRequest.responseText区别

  1. XMLHttpRequest.response 属性

    返回响应的正文。返回的类型为 ArrayBuffer 、 Blob 、 Document 、JavaScript Object 或 DOMString 中的一个。 这取决于 responseType 属性。

  2. XMLHttpRequest.responseText

    返回类型为DOMString的纯文本的值。

XMLHttpRequest.overrideMimeType()与XMLHttpRequest.responseType

  1. XMLHttpRequest.responseType

    responseType 决定了写入response的响应数据被解析成什么类型的数据。在这里XHR直接封装好了内部解析响应,省去手动解析响应主体的步骤。要在调用 open() 初始化请求之后调用,并且要在调用 send() 发送请求到服务器之前调用

    let xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {  //一定要在open方法前
        if (xhr.readyState == 4) { 
            if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) { 
                alert(xhr.response); //json格式
            }
        } 
    }; 
    xhr.open("get", "example.txt", true); //get请求,true异步
    xhr.responseType = "json";
    xhr.send(null)
  2. XMLHttpRequest.overrideMimeType()

    overrideMimeType 方法是指定一个MIME类型用于替代服务器指定的类型(相当于重写响应类型),使服务端响应信息中传输的数据按照该指定MIME类型处理。例如强制使流方式处理为"text/xml"类型处理时会被使用到,即使服务器在响应头中并没有这样指定。此方法必须在send方法之前调用方为有效。

    let xhr = new XMLHttpRequest();
    xhr.overrideMimeType("text/plain");
    xhr.open("get", "example.txt", true); //get请求,true异步
    xhr.send(null)

    参考:MDN

Twlig commented 2 years ago

XMLHttpRequest.withCredentials与 CORS 什么关系 在发同域请求时,浏览器会将cookie自动加在request header中。但在发送跨域请求时,cookie并没有自动加在request header中。 造成这个问题的原因是:在CORS标准中做了规定,默认情况下,浏览器在发送跨域请求时,不能发送任何认证信息(credentials)如"cookies"和"HTTP authentication schemes"。除非withCredentials为true(xhr对象有一个属性叫withCredentials,默认值为false)。 所以根本原因是cookies也是一种认证信息,在跨域请求中,client端必须手动设置withCredentials=true,且server端也必须允许request能携带认证信息(即response header中包含Access-Control-Allow-Credentials:true),这样浏览器才会自动将cookie加在request header中。

另外,要特别注意一点,一旦跨域request能够携带认证信息,server端一定不能将Access-Control-Allow-Origin设置为*,而必须设置为请求页面的域名。 参考:cookies