# 拦截器与中间件

URL: https://caijiao.org/ky/interceptors-middleware
Source: docs/ky/interceptors-middleware.md
Description: 讲解如何使用 Ky 的 hooks 机制在请求前或响应后执行自定义逻辑，实现拦截器和中间件功能。

Ky 提供 `hooks` 机制，可以在请求发送前或响应返回后执行自定义逻辑，实现类似拦截器和中间件的功能。

## 请求前拦截

使用 `beforeRequest` hook 可以在请求发送前修改请求或执行额外操作：

```javascript
import ky from 'ky';

const api = ky.create({
  hooks: {
    beforeRequest: [
      request => {
        console.log('即将发送请求:', request.url);
        // 可修改请求头
        request.headers.set('X-Custom-Header', 'value');
      }
    ]
  }
});

api.get('https://api.example.com/data').json();
````

## 响应后拦截

使用 `afterResponse` hook 可以在响应返回后处理逻辑：

```javascript
const api = ky.create({
  hooks: {
    afterResponse: [
      (request, options, response) => {
        console.log('收到响应:', response.status);
        if (!response.ok) {
          console.warn(`请求 ${request.url} 返回错误状态码 ${response.status}`);
        }
      }
    ]
  }
});

api.get('https://api.example.com/data').json();
```

## 异常处理拦截

在 `afterResponse` 中也可以捕获和处理错误：

```javascript
const api = ky.create({
  hooks: {
    afterResponse: [
      (request, options, response) => {
        if (!response.ok) {
          throw new Error(`请求失败，状态码 ${response.status}`);
        }
      }
    ]
  }
});
```

## 小结

* Ky 的 `hooks` 可以在请求前或响应后执行自定义逻辑。
* `beforeRequest` 用于修改请求或添加日志。
* `afterResponse` 用于统一处理响应、日志记录或错误处理。
* 结合 hooks，可实现拦截器和中间件模式，提高代码复用性和可维护性。
