Response 和 Request 类似,表示的是一次请求返回的响应数据。下面我们先看下规范中定义了哪些接口。

  1. [Constructor(optional BodyInit? body = null, optional ResponseInit init), Exposed=(Window,Worker)]
  2. interface Response {
  3. [NewObject] static Response error();
  4. [NewObject] static Response redirect(USVString url, optional unsigned short status = 302);
  5. readonly attribute ResponseType type;
  6. readonly attribute USVString url;
  7. readonly attribute boolean redirected;
  8. readonly attribute unsigned short status;
  9. readonly attribute boolean ok;
  10. readonly attribute ByteString statusText;
  11. [SameObject] readonly attribute Headers headers;
  12. readonly attribute Promise<Headers> trailer;
  13. [NewObject] Response clone();
  14. };
  15. Response includes Body;
  16. dictionary ResponseInit {
  17. unsigned short status = 200;
  18. ByteString statusText = "";
  19. HeadersInit headers;
  20. };
  21. enum ResponseType { "basic", "cors", "default", "error", "opaque", "opaqueredirect" };
  22. // 来自 https://fetch.spec.whatwg.org/#response-class

规范中定义的接口我们可以对应着 MDN 进行查看,你可以点击这里更直观的看看它有哪些属性和方法供我们使用,这里不做一一解释。

其中 status, headers 属性最为常用。通过 status 状态码我们可以判断出服务端请求处理的结果,像 200, 403 等等常见状态码。这里举个例子,当 status401 时,可以在前端进行拦截跳转到登录页面,这在现如今 SPA(单页面应用程序)中尤为常见。我们也可以利用 headers 来获取一些服务端返回给前端的信息,比如 token

仔细看上面的接口的同学可以发现 Response includes Body; 这样的标识。在前面我们说过 BodyRequestResponse 实现。所以 Body 具有的方法,在 Response 实例中都可以使用,而这也是非常重要的一部分,我们通过 Body 提供的方法(这里准确来说是由 Response 实现的)对服务端返回的数据进行处理。

下面我们将通过一个示例来了解下简单用法:

示例

示例代码位置:https://github.com/GoDotDotDot/fe9-fetch-demo/blob/master/views/response.html#L36

  1. // 客户端
  2. const headers = new Headers({
  3. 'X-Token': 'fe9-token-from-frontend',
  4. });
  5. const request = new Request('/api/response', {
  6. method: 'GET',
  7. headers,
  8. });
  9. // 这里我们先发起一个请求试一试
  10. fetch(request)
  11. .then(response => {
  12. const { status, headers } = response;
  13. document.getElementById('status').innerHTML = `${status}`;
  14. document.getElementById('headers').innerHTML = headersToString(headers);
  15. return response.json();
  16. })
  17. .then(resData => {
  18. const { status, data } = resData;
  19. if (!status) {
  20. window.alert('发生了一个错误!');
  21. return;
  22. }
  23. document.getElementById('fetch').innerHTML = data;
  24. });

这里我们先忽略 fetch 用法,后面的章节中会进行详细介绍。我们先关注第一个 then 方法回调里面的东西。可以看到返回了一个 response 对象,这个对象就是我们的 Response 的实例。示例中拿了 statusheaders ,为了方便,这里我将其放到 html 中。再看看该回调中最后一行,我们调用了一个 response.json() 方法(这里后端返的数据是一个 JSON 对象,为了方便直接调用 json()),该方法返回一个 Promise,我们将处理结果返给最后一个 then 回调,这样就可以获得最终处理过后的数据。

打开浏览器,输入 http://127.0.0.1:4000/response,如果你的示例代运行正常,你将会看到以下页面:

Response - 图1
(查看 Response 返回的数据)