JavaScript fetch

JavaScript 获取教程展示了如何使用获取 API 在 JavaScript 中异步获取资源。

获取函数

fetch 是一个全局函数,它接受 url 和选项参数并返回一个承诺。承诺解决请求的响应。

let promise = fetch(url, [options])

如果我们不提供options,将生成一个简单的 GET 请求来下载 url 的内容。

当我们得到响应时,我们可以检查 HTTP 状态或标头,但我们还没有正文。为了获取响应的主体,我们调用以下方法之一:

  • response.text() ― 将响应读取为文本
  • response.json() ― 将响应解析为 JSON
  • response.formData( ) ― 将响应作为 FormData 对象返回
  • response.blob() ― 将响应作为 Blob 返回
  • response.arrayBuffer() ― 将响应作为 ArrayBuffer 返回(二进制数据的低级表示)

fetch 函数可以与回调一起使用,也可以与async/await 关键字一起使用。

JavaScript 获取简单示例

在第一个示例中,我们使用fetch 函数生成一个简单的异步 GET 请求。

<script>
    fetch('http://time.jsontest.com')
        .then(res => res.json())
        .then((data) => {

            console.log(data);
        }).catch(err => console.error(err));
</script>

在这个例子中,我们使用回调。 time.jsontest.com 以 JSON 格式返回当前时间。从响应对象中,我们使用 json 函数检索数据。

Object { date: "01-26-2021", milliseconds_since_epoch: 1611661589016, 
    time: "11:46:29 AM" }

我们在浏览器中检查控制台输出。

<script>

    async function doRequest() {
        let url = 'http://time.jsontest.com';
        let res = await fetch(url);

        if (res.ok) {

            let json = await res.json();

            return json;
        } else {
            return `HTTP error: ${res.status}`;
        }
    }

    doRequest().then(data => {
        console.log(data);
    });

</script>

在此示例中,我们使用async/await 关键字。

if (res.ok) {

ok 属性为 HTTP 状态代码 200-299 返回一个布尔值 true。

JS 获取 GET 请求

以下示例创建一个简单的 GET 请求并将结果作为文本处理。

<script>
    async function doRequest() {
        let url = 'http://webcode.me';
        let res = await fetch(url);

        if (res.ok) {

            let text = await res.text();

            return text;
        } else {
            return `HTTP error: ${res.status}`;
        }
    }

    doRequest().then(data => {
        console.log(data);
    });

</script>

我们得到了 webcode.me 网页的内容。

let url = 'http://webcode.me';
let res = await fetch(url);

fetch 方法只接受 URL 作为参数。在这种情况下,默认请求是 GET 请求。

let text = await res.text();

我们从纯文本形式的请求中获取正文。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>My html page</title>
</head>
<body>

    <p>
        Today is a beautiful day. We go swimming and fishing.
    </p>
    
    <p>
         Hello there. How are you?
    </p>
    
</body>
</html>

这是我们可以在浏览器控制台窗口中看到的输出。

JS 获取带有查询参数的 GET 请求

在下面的示例中,我们将一些查询参数附加到 URL。

<script>
    async function doRequest() {

        let url = new URL('http://httpbin.org/get');
        let params = {'name': 'John Doe', 'occupation': 'John Doe'};
        url.search = new URLSearchParams(params);

        let res = await fetch(url);

        if (res.ok) {

            let text = await res.text();

            return text;
        } else {
            return `HTTP error: ${res.status}`;
        }
    }

    doRequest().then(data => {
        console.log(data);
    });

</script>

我们使用URLSearchParams 将JSON 对象转换为合适的URL 查询形式。

{
  "args": {
    "name": "John Doe", 
    "occupation": "John Doe"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Accept-Language": "en-US,en;q=0.5", 
    "Host": "httpbin.org", 
    "Origin": "null", 
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0", 
    "X-Amzn-Trace-Id": "Root=1-600ff33e-71b89c984ad2878035263a8b"
  }, 
  ...
  "url": "http://httpbin.org/get?name=John+Doe&occupation=John+Doe"
}

我们从httpbin.org 网页获得此输出。

JS fetch 获取图片

以下示例检索图像并将其显示在页面上。

<script>
    async function doRequest() {
        let url = 'https://dummyimage.com/100x100/499deb/fff';
        let res = await fetch(url);
        let blob = await res.blob(); 

        return blob;
    }

    doRequest().then(blob => {

        let img = document.createElement('img');
        document.body.append(img);

        img.src = URL.createObjectURL(blob);
    });
</script>

示例使用 dummyimage.com网页获取图片。这是一个用于测试目的的小测试页。

let blob = await res.blob(); 

要获取图像数据,我们调用blob 函数。

let img = document.createElement('img');
document.body.append(img);

我们以编程方式创建img 标签。

img.src = URL.createObjectURL(blob);

我们使用createObjectURL 函数创建图像。

JS 获取 JSON POST 请求

以下示例使用 JSON 数据生成 POST 请求。

<script>
    async function doRequest() {

        let url = 'http://httpbin.org/post';
        let data = {'name': 'John Doe', 'occupation': 'John Doe'};

        let res = await fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify(data),
        });

        if (res.ok) {

            // let text = await res.text();
            // return text;

            let ret = await res.json();
            return JSON.parse(ret.data);

        } else {
            return `HTTP error: ${res.status}`;
        }
    }

    doRequest().then(data => {
        console.log(data);
    });

</script>

请求被发送到 http://httpbin.org/post。

let data = {'name': 'John Doe', 'occupation': 'John Doe'};

这是要发送的数据。

let res = await fetch(url, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify(data),
});

我们将method 参数设置为POST 并选择application/json 作为内容类型。数据被字符串化为body参数。

let ret = await res.json();
return JSON.parse(ret.data);

我们将数据作为 JSON 字符串取回并将其解析为 JSON 对象。

Object { name: "John Doe", occupation: "John Doe" }

JS 获取 POST 表单数据

在下面的示例中,我们生成一个带有表单数据的 POST 请求。

使用application/x-www-form-urlencoded,数据在请求的正文中发送;键和值被编码在由“&”分隔的键值元组中,键和值之间有一个“=”。

<script>
    async function doRequest() {

        let url = 'http://httpbin.org/post';

        let formData = new FormData();
        formData.append('name', 'John Doe');
        formData.append('occupation', 'gardener');

        let res = await fetch(url, {
            method: 'POST',
            body: formData,
        });

        if (res.ok) {

            let text = await res.text();
            return text;

        } else {
            return `HTTP error: ${res.status}`;
        }
    }

    doRequest().then(data => {
        console.log(data);
    });

</script>

为了以适当的格式生成表单数据,我们使用FormDataobject。

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "name": "John Doe", 
    "occupation": "gardener"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Accept-Language": "en-US,en;q=0.5", 
    "Content-Length": "305", 
    "Content-Type": "multipart/form-data; ... 
    "Host": "httpbin.org", 
    "Origin": "null", 
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0", 
    "X-Amzn-Trace-Id": "Root=1-600ff649-4cd21c6a503e694211f73b0c"
  }, 
  "json": null, 
  ...
  "url": "http://httpbin.org/post"
}

在本文中,我们使用了 JavaScript fetch API。

列出 JavaScript 教程。

赞(0) 打赏

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏