Skip to content

如何在JavaScript中执行HTTP请求?

HTTP协议是Web上数据通信的基础。它是一种请求-响应协议,意味着客户端发送请求到服务器,服务器返回响应给客户端。

最常见的HTTP方法是GETPOSTPUTDELETE。通过JavaScript发送请求非常常见,可以使用更现代的fetch API或较旧的XMLHttpRequest Web API来实现。

使用Fetch API

Fetch APIXMLHttpRequest的现代替代品。它是一个基于Promise的API,允许您像XMLHttpRequest一样进行网络请求,但具有更简单和更强大的接口。

HTTP GET请求

最简单的用例是向给定的URL发出GET请求。由于fetch() API返回一个Promise,您可以使用then方法处理响应。在下面的示例中,响应使用json()方法转换为JSON,然后记录到控制台。

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(response => response.json())
  .then(data => console.log(data));

/* 输出: {
  'userId': 1,
  'id': 1,
  'title': 'sunt aut facere repellat provident occaecati…',
  'body': '…'
} */

HTTP POST请求

要进行POST请求,您需要将请求选项的对象作为fetch()的第二个参数传递。method选项设置为'POST'body选项设置为要发送的数据。

body选项中的数据类型可能会有所不同,并且应根据Content-type头进行编码。在下面的示例中,数据被编码为JSON,使用JSON.stringify,并且Content-type头设置为'application/json; charset=UTF-8'

fetch('https://jsonplaceholder.typicode.com/posts', {
  method: 'POST',
  body: JSON.stringify({
    title: 'foo',
    body: 'bar',
    userId: 1
  }),
  headers: {
    'Content-type': 'application/json; charset=UTF-8'
  }
})
  .then(response => response.json())
  .then(data => console.log(data));

/* 输出: {
  'title': 'foo',
  'body': 'bar',
  'userId': 1,
  'id': 101
} */

HTTP PUT请求

POST请求类似,您可以通过在请求选项对象中将method选项设置为'PUT'来进行PUT请求。其余的请求选项与POST请求相同。

fetch('https://jsonplaceholder.typicode.com/posts/1', {
  method: 'PUT',
  body: JSON.stringify({
    id: 1,
    title: 'foo',
    body: 'bar',
    userId: 1
  }),
  headers: {
    'Content-type': 'application/json; charset=UTF-8'
  }
})
  .then(response => response.json())
  .then(data => console.log(data));

/* 输出: {
  'id': 1,
  'title': 'foo',
  'body': 'bar',
  'userId': 1
} */

HTTP DELETE请求

要进行DELETE请求,您需要在请求选项对象中将method选项设置为'DELETE'DELETE请求没有请求体,因此在下面的示例中省略了body选项。

fetch('https://jsonplaceholder.typicode.com/posts', {
  method: 'POST',
  body: JSON.stringify({
    title: 'foo',
    body: 'bar',
    userId: 1
  }),
  headers: {
    'Content-type': 'application/json; charset=UTF-8'
  }
})
  .then(response => response.json())
  .then(data => console.log(data));

/* Logs: {
  'title': 'foo',
  'body': 'bar',
  'userId': 1,
  'id': 101
} */

使用XMLHttpRequest

XMLHttpRequest是JavaScript中进行HTTP请求的旧方法。它不如fetch API强大,但仍然被广泛使用,并且在所有现代浏览器中都得到支持。

XMLHttpRequest使用事件监听器来处理响应和错误,而不是使用Promise。onload事件用于处理响应,onerror事件用于处理错误。

发送HTTP GET请求

以下示例使用XMLHttpRequest web API向给定的URL发送GET请求。当请求成功时,调用给定的callback函数并传递responseText,当发生错误时调用err函数。

const httpGet = (url, callback, err = console.error) => {
  const request = new XMLHttpRequest();
  request.open('GET', url, true);
  request.onload = () => callback(request.responseText);
  request.onerror = () => err(request);
  request.send();
};

httpGet(
  'https://jsonplaceholder.typicode.com/posts/1',
  console.log
);
/* Logs: {
  'userId': 1,
  'id': 1,
  'title': 'sunt aut facere repellat provident occaecati…',
  'body': '…'
} */

发送HTTP POST请求

以下示例使用XMLHttpRequest Web API向给定的URL发出POST请求。data参数是要发送的数据,callback函数在请求成功时被调用,并传入responseText。为了设置Content-type头部,你需要使用setRequestHeader方法。

const httpPost = (url, data, callback, err = console.error) => {
  const request = new XMLHttpRequest();
  request.open('POST', url, true);
  request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
  request.onload = () => callback(request.responseText);
  request.onerror = () => err(request);
  request.send(data);
};

httpPost(
  'https://jsonplaceholder.typicode.com/posts',
  JSON.stringify({
    userId: 1,
    id: 1337,
    title: 'Foo',
    body: 'bar bar bar'
  }),
  console.log
);
/* 输出: {
  'title': 'foo',
  'body': 'bar',
  'userId': 1,
  'id': 101
} */

HTTP PUT请求

以下示例使用XMLHttpRequest Web API向给定的URL发出PUT请求。data参数是要发送的数据,callback函数在请求成功时被调用,并传入responseText

const httpPut = (url, data, callback, err = console.error) => {
  const request = new XMLHttpRequest();
  request.open('PUT', url, true);
  request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
  request.onload = () => callback(request);
  request.onerror = () => err(request);
  request.send(data);
};

httpPut(
  'https://jsonplaceholder.typicode.com/posts/1',
  JSON.stringify({
    id: 1,
    title: 'foo',
    body: 'bar',
    userId: 1
  }),
  request => console.log(request.responseText)
);
/* 输出: {
  'id': 1,
  'title': 'foo',
  'body': 'bar',
  'userId': 1
} */

HTTP DELETE请求

以下示例使用XMLHttpRequest Web API向给定的URL发出DELETE请求。callback函数在请求成功时被调用,并传入responseText

const httpDelete = (url, callback, err = console.error) => {
  const request = new XMLHttpRequest();
  request.open('DELETE', url, true);
  request.onload = () => callback(request);
  request.onerror = () => err(request);
  request.send();
};

httpDelete('https://jsonplaceholder.typicode.com/posts/1', request => {
  console.log(request.responseText);
});
/* 输出: {} */