1.3.1.2 QN.fetch

优质
小牛编辑
141浏览
2023-12-01

符合 W3C Fetch 规范的 Fetch 接口,用于异步 HTTP 请求。

1.1. API 调用

1.1.1. QN.fetch(input, init)

发起 fetch 请求

API 调用入参

参数名类型是否可选默认值含义
inputRequest String请求的资源,具体值为 Request 实例或 URL 地址。更多参考
initObjectoptional请求初始化选项
init.methodStringoptionalGET请求方式:GET POST
init.headersHeaders Objectoptional请求头。更多参考
init.bodyStringoptional请求体
init.modeStringoptionalno-cors请求模式:cors no-cors same-origin更多参考
init.credentialsStringoptionalomit请求对认证信息(HTTP cookie、TLS 证书、身份验证信息)的处理,可选值为 omit same-origin include
init.timeoutNumber Booleanoptionalfalse超时时间,单位:ms,为 false 时表示不考虑超时

参数详解:

  • init.body:请求体,在不同类型的页面环境中,支持程度不一(见下表),需开发者选择使用。
  • init.mode:请求模式,该字段仅在 Web 页面环境中有效。
    • cors:全称为 Cross-Origin Resource Sharing (跨域资源共享),通常用于跨域请求,如从第三方提供的 API 获取数据。该模式需要遵守 CORS 协议,服务端按照协议进行配置正确才能支持跨域请求。
    • no-cors:该模式也允许跨域请求,例如请求来着 CDN 的图片、脚本或者其他一些跨域资源。但是和 cors 不同的是,通过 no-cors 模式请求的资源,开发者可以使用它,但是不能读取或修改资源的内容。如:开发者能加载公共 CDN 的JS类库脚本并使用它,但是不能修改脚本的内容。这样确保了跨域资源的安全性。同时,该模式下请求的 method 只能是 HEADGETPOST
    • same-origin:同源模式,该模式很简单,如果一个请求是跨域的,那么将返回一个 error,这样确保所有的请求遵守同源策略。所以该模式下,发起请求的域和请求的域必须相同才能请求成功。
  • init.credentials:请求对认证信息的处理,该字段仅在 Web 页面环境下有效。认证信息有:HTTP cookie、TLS 证书、身份验证信息
    • omit:忽略认证信息。
    • same-origin:同源模式。发起请求的域和请求的域相同,该模式下会自动携带认证信息。
    • include:包含。当 modecors 时,请求默认是不携带认证信息的,如果服务端需要认证信息信息,则可以将这个字段设置为 include。另外,当此字段的值为 include 时,服务端响应头的 Access-Control-Allow-Origin 的值不能设置为 *,必须指定域名规则。否则请求会报错。
init.bodyNative 页面支持Web 页面支持备注
Blob✖️✔️
File✖️✔️继承并扩展自 Blob
ArrayBuffer✖️✔️属于 BufferSource
ArrayBufferView✖️✔️属于 BufferSource
FormData✖️✔️
URLSearchParams✖️✔️
String✔️✔️

API 响应结果

参数名类型是否必须返回含义
responseResponse响应对象

调用示例

// input 是 Request
let request = new Request('http://qianniu.taobao.com/api/todo', {
    method: 'POST',
    headers: {
        'Accept': 'application/json, application/javascript',
        'Content-Type': 'application/x-www-form-urlencoded',
    },
    body: 'id=233&content=hello',
    mode: 'same-origin',
});

QN.fetch(request)
.then(response => {
    return response.json(); // => 返回一个 `Promise` 对象
})
.then(data => {
    console.log(data); // 真正地数据结果
})
.catch(error => {
    console.log(error);
});

// input 是 URL String
QN.fetch('http://qianniu.taobao.com/api/todo', {
    method: 'POST',
    headers: {
        'Accept': 'application/json, application/javascript',
        'Content-Type': 'application/x-www-form-urlencoded',
    },
    body: 'id=233&content=hello',
    mode: 'same-origin',
})
.then(response => {
    return response.json(); // => 返回一个 `Promise` 对象
})
.then(data => {
    console.log(data); // 真正地数据结果
})
.catch(error => {
    console.log(error);
});

场景示例

如何让服务端正确解析请求 body

对于如 Spring 等常见的服务端 MVC 框架,会自动解析请求的数据,比如 query string 和 body。一般情况下,解析时框架会根据 HTTP 请求头中的 Content-Type 字段来判断 body 类型,再调用相应的类库。因此,请求时在请求头中设置正确的 Content-Type,帮助服务端正确解析请求数据:

// body 的类型是 JSON
QN.fetch('http://qianniu.taobao.com/api/todo', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        id: 233,
        content: 'hello',
    }),
});

// body 的类型是 text
QN.fetch('http://qianniu.taobao.com/api/todo', {
    method: 'POST',
    headers: {
        'Content-Type': 'text/plain',
    },
    body: 'Hello QAP',
});

// body 的类型是 query string 的形式, Content-Type 可以省略
QN.fetch('http://qianniu.taobao.com/api/todo', {
    method: 'POST',
    headers: { },
    body: 'id=233&content=hello',
});
请求 URL 添加 query string
let queryString = QN.uri.toQueryString({
    x: 1,
    y: 2,
});

let body = QN.uri.toQueryString({
    id: 233,
    content: 'hello',
});

QN.fetch(`http://qianniu.taobao.com/api/todo?${queryString}`, {
    method: 'POST',
    body: body,
});

1.2. 参考