块编辑器开发文档

@wordpress/api-fetch

💡 云策文档标注

概述

@wordpress/api-fetch 是一个用于发起 WordPress REST API 请求的实用工具,基于 window.fetch 封装,简化了 API 调用过程。它支持 GET、POST 等 HTTP 方法,并提供了中间件、自定义 fetch 处理器等高级功能,适用于现代 JavaScript 环境。

关键要点

  • 安装方式:通过 npm 安装 @wordpress/api-fetch 包,需确保运行环境支持 ES2015+,否则需包含 polyfill。
  • 基本用法:使用 apiFetch 函数发起请求,支持 path、url、method、data 等选项,默认解析 JSON 响应。
  • 高级功能:支持 AbortController 中止请求、中间件机制(如内置 nonce 和 rootURL 中间件)以及自定义 fetch 处理器。
  • 选项说明:包括 path(相对路径)、url(绝对 URL)、parse(是否解析 JSON)、data(POST/PUT 数据)等。

代码示例

import apiFetch from '@wordpress/api-fetch';

// GET 请求
apiFetch( { path: '/wp/v2/posts' } ).then( ( posts ) => {
    console.log( posts );
} );

// POST 请求
apiFetch( {
    path: '/wp/v2/posts/1',
    method: 'POST',
    data: { title: 'New Post Title' },
} ).then( ( res ) => {
    console.log( res );
} );

// 中止请求示例
const controller = typeof AbortController === 'undefined' ? undefined : new AbortController();
apiFetch( { path: '/wp/v2/posts', signal: controller?.signal } ).catch( ( error ) => {
    if ( error.name === 'AbortError' ) {
        console.log( 'Request has been aborted' );
    }
} );
controller?.abort();

// 中间件示例
apiFetch.use( ( options, next ) => {
    const start = Date.now();
    const result = next( options );
    result.then( () => {
        console.log( 'The request took ' + ( Date.now() - start ) + 'ms' );
    } );
    return result;
} );

注意事项

  • 环境要求:包假设运行在 ES2015+ 环境,旧环境需使用 @wordpress/babel-preset-default 中的 polyfill。
  • 中止请求:依赖 AbortController,旧浏览器可能不支持,需提供 polyfill 或忽略此功能。
  • 中间件使用:可通过 apiFetch.use 添加自定义中间件,内置 createNonceMiddleware 和 createRootURLMiddleware 简化常见任务。
  • 自定义 fetch 处理器:使用 setFetchHandler 可替换默认的 window.fetch,例如集成 axios。

📄 原文内容

Utility to make WordPress REST API requests. It’s a wrapper around window.fetch.

Installation

Install the module

npm install @wordpress/api-fetch --save

This package assumes that your code will run in an ES2015+ environment. If you’re using an environment that has limited or no support for such language features and APIs, you should include the polyfill shipped in @wordpress/babel-preset-default in your code.

Usage

GET

import apiFetch from '@wordpress/api-fetch';

apiFetch( { path: '/wp/v2/posts' } ).then( ( posts ) => {
    console.log( posts );
} );

GET with Query Args

import apiFetch from '@wordpress/api-fetch';
import { addQueryArgs } from '@wordpress/url';

const queryParams = { include: [1,2,3] }; // Return posts with ID = 1,2,3.

apiFetch( { path: addQueryArgs( '/wp/v2/posts', queryParams ) } ).then( ( posts ) => {
    console.log( posts );
} );

POST

apiFetch( {
    path: '/wp/v2/posts/1',
    method: 'POST',
    data: { title: 'New Post Title' },
} ).then( ( res ) => {
    console.log( res );
} );

Options

apiFetch supports and passes through all options of the fetch global.

Additionally, the following options are available:

path (string)

Shorthand to be used in place of url, appended to the REST API root URL for the current site.

url (string)

Absolute URL to the endpoint from which to fetch.

parse (boolean, default true)

Unlike fetch, the Promise return value of apiFetch will resolve to the parsed JSON result. Disable this behavior by passing parse as false.

data (object)

Sent on POST or PUT requests only. Shorthand to be used in place of body, accepts an object value to be stringified to JSON.

Aborting a request

Aborting a request can be achieved through the use of AbortController in the same way as you would when using the native fetch API.

For legacy browsers that don’t support AbortController, you can either:

  • Provide your own polyfill of AbortController if you still want it to be abortable.
  • Ignore it as shown in the example below.

Example

const controller =
    typeof AbortController === 'undefined' ? undefined : new AbortController();

apiFetch( { path: '/wp/v2/posts', signal: controller?.signal } ).catch(
    ( error ) => {
        // If the browser doesn't support AbortController then the code below will never log.
        // However, in most cases this should be fine as it can be considered to be a progressive enhancement.
        if ( error.name === 'AbortError' ) {
            console.log( 'Request has been aborted' );
        }
    }
);

controller?.abort();

Middlewares

the api-fetch package supports middlewares. Middlewares are functions you can use to wrap the apiFetch calls to perform any pre/post process to the API requests.

Example

import apiFetch from '@wordpress/api-fetch';

apiFetch.use( ( options, next ) => {
    const start = Date.now();
    const result = next( options );
    result.then( () => {
        console.log( 'The request took ' + ( Date.now() - start ) + 'ms' );
    } );
    return result;
} );

Built-in middlewares

The api-fetch package provides built-in middlewares you can use to provide a nonce and a custom rootURL.

Nonce middleware

import apiFetch from '@wordpress/api-fetch';

const nonce = 'nonce value';
apiFetch.use( apiFetch.createNonceMiddleware( nonce ) );

The function returned by createNonceMiddleware includes a nonce property corresponding to the actively used nonce. You may also assign to this property if you have a fresh nonce value to use.

Root URL middleware

import apiFetch from '@wordpress/api-fetch';

const rootURL = 'http://my-wordpress-site/wp-json/';
apiFetch.use( apiFetch.createRootURLMiddleware( rootURL ) );

Custom fetch handler

The api-fetch package uses window.fetch for making the requests but you can use a custom fetch handler by using the setFetchHandler method. The custom fetch handler will receive the options passed to the apiFetch calls.

Example

The example below uses a custom fetch handler for making all the requests with axios.

import apiFetch from '@wordpress/api-fetch';
import axios from 'axios';

apiFetch.setFetchHandler( ( options ) => {
    const { url, path, data, method } = options;

    return axios( {
        url: url || path,
        method,
        data,
    } );
} );

Contributing to this package

This is an individual package that’s part of the Gutenberg project. The project is organized as a monorepo. It’s made up of multiple self-contained software packages, each with a specific purpose. The packages in this monorepo are published to npm and used by WordPress as well as other software projects.

To find out more about contributing to this package or Gutenberg as a whole, please read the project’s main contributor guide.