JS Fetch的用法

JS Fetch的用法

JS Fetch的用法

在前端开发中,经常需要与后端进行数据交互。而使用 JavaScript 的 fetch 函数能够轻松地发送 HTTP 请求来与服务器进行通信。本文将详细介绍 JS Fetch 的用法,包括发送 GET 和 POST 请求、处理响应、传递请求头和设置超时等。

一、发送 GET 请求

1. 基本用法

使用 fetch 函数发送 GET 请求非常简单,只需要传入请求的 URL 即可。下面是一个示例:

fetch('https://api.example.com/users')
    .then(response => response.json())
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

在这个示例中,我们发送了一个 GET 请求到 https://api.example.com/users 这个 URL。fetch 函数返回的是一个 Promise 对象,我们可以通过调用 .then() 方法来处理响应。在第一个 .then() 中,我们使用 response.json() 方法将响应数据解析为 JSON 格式。然后,我们在第二个 .then() 中使用解析后的数据。

2. 处理错误

在使用 fetch 函数发送请求时,可能会发生网络错误或服务器返回错误状态码。我们可以使用 .catch() 方法来捕获并处理这些错误。

fetch('https://api.example.com/users')
    .then(response => {
        if (!response.ok) {
            throw new Error('HTTP error, status = ' + response.status);
        }
        return response.json();
    })
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

在这个示例中,我们在第一个 .then() 中通过检查 response.ok 属性来判断是否发生了错误。如果 response.okfalse,则通过 throw 语句抛出一个自定义的错误。在第二个 .then() 中,我们仍然使用解析后的数据。

3. 传递参数

如果发送 GET 请求时需要传递参数,可以将参数拼接到 URL 后面。示例如下:

const params = {
    page: 1,
    limit: 10
};

const url = new URL('https://api.example.com/users');
url.search = new URLSearchParams(params).toString();

fetch(url)
    .then(response => response.json())
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

在这个示例中,我们定义了一个 params 对象,包含了两个参数 pagelimit。然后,我们通过 URLSearchParams 对象将参数转换为 URL 查询字符串,并将其附加到 URL 后面。

二、发送 POST 请求

1. 基本用法

发送 POST 请求时,需要指定请求方法为 POST,并将请求数据作为 body 参数传递给 fetch 函数。下面是一个示例:

const data = {
    username: 'exampleuser',
    password: 'examplepassword'
};

fetch('https://api.example.com/login', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify(data)
})
    .then(response => response.json())
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

在这个示例中,我们发送了一个 POST 请求到 https://api.example.com/login 这个 URL。我们通过 method 参数指定请求方法为 POST,并设置请求头的 Content-Typeapplication/json。我们使用 JSON.stringify() 方法将请求数据转换为 JSON 字符串,并作为 body 参数传递给 fetch 函数。

2. 传递表单数据

如果需要发送表单数据,可以将请求头的 Content-Type 设置为 application/x-www-form-urlencoded。下面是一个示例:

const data = new URLSearchParams();
data.append('username', 'exampleuser');
data.append('password', 'examplepassword');

fetch('https://api.example.com/login', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: data
})
    .then(response => response.json())
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

在这个示例中,我们使用了 URLSearchParams 对象来存储表单数据,并将其作为 body 参数传递给 fetch 函数。

三、处理响应

1. JSON 响应

在上面的示例中,我们使用了 .json() 方法将响应数据解析为 JSON 格式。如果服务器返回的是 JSON 数据,可以直接使用此方法。但是,如果服务器返回的是其他类型的数据(如文本或二进制数据),则需要使用其他方法。示例代码如下:

fetch('https://api.example.com/users')
    .then(response => {
        if (!response.ok) {
            throw new Error('HTTP error, status = ' + response.status);
        }
        // 如果服务器返回的是 JSON 数据
        if (response.headers.get('content-type').includes('application/json')) {
            return response.json();
        }
        // 如果服务器返回的是文本数据
        if (response.headers.get('content-type').includes('text/plain')) {
            return response.text();
        }
        // 其他情况
        throw new Error('Unsupported content type');
    })
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

在这个示例中,我们在第一个 .then() 中检查响应的 content-type 头部字段,判断服务器返回的数据类型。根据不同的数据类型,我们可以使用不同的方法进行解析,如使用 .json() 方法将响应解析为 JSON 格式,使用 .text() 方法将响应解析为文本格式。

2. 处理响应头

fetch 函数返回的响应对象包含了许多有用的属性和方法,可以用来处理响应头。示例代码如下:

fetch('https://api.example.com/users')
    .then(response => {
        console.log(response.status); // 输出响应状态码
        console.log(response.statusText); // 输出响应状态文本
        console.log(response.headers.get('content-type')); // 输出 'content-type' 头部字段的值
        console.log(response.headers.get('date')); // 输出 'date' 头部字段的值
        console.log(response.url); // 输出响应的 URL
        console.log(response.redirected); // 输出是否发生了重定向
        console.log(response.type); // 输出响应的类型
        console.log(response.ok); // 输出响应是否成功
        return response.json();
    })
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

在这个示例中,我们使用了一些响应对象的属性和方法,如 status 用于获取响应状态码,headers.get() 用于获取指定头部字段的值,url 用于获取响应的 URL 等。

四、传递请求头

如果需要在发送请求时传递特定的请求头,可以在 fetch 函数的第二个参数中指定 headers。示例如下:

fetch('https://api.example.com/users', {
    headers: {
        'Authorization': 'Bearer token123',
        'Content-Type': 'application/json'
    }
})
    .then(response => response.json())
    .then(data => {
        console.log(data);
    })
    .catch(error => {
        console.error(error);
    });

在这个示例中,我们通过在 fetch 函数的第二个参数中指定 headers 对象来传递请求头。可以在 headers 对象中设置多个头部字段,并将其对应的值作为属性值。

五、设置超时

如果希望在请求超时时执行特定的操作,可以使用 AbortController 和 signal 属性。示例如下:

const controller = new AbortController();
const signal = controller.signal;

const timeout = setTimeout(() => {
    controller.abort();
    console.error('请求超时');
}, 5000); // 设置超时时间为5秒

fetch('https://api.example.com/users', { signal })
    .then(response => response.json())
    .then(data => {
        clearTimeout(timeout); // 清除超时计时器
        console.log(data);
    })
    .catch(error => {
        clearTimeout(timeout); // 清除超时计时器
        console.error(error);
    });

在这个示例中,我们创建了一个 AbortController 对象,然后通过 setTimeout 函数设置了超时时间为 5 秒。在超时时间到达后,我们调用 controller.abort() 方法来终止请求。同时,在 fetch 函数的第二个参数中设置了 signal 属性为 controller.signal,以便将中止信号传递给 fetch 函数。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程