logologo
시작
가이드
개발
플러그인
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
시작
가이드
개발
플러그인
API
logologo

빠른 시작

플러그인 개발 개요
첫 플러그인 작성
프로젝트 디렉토리 구조

서버사이드 개발

개요
Plugin 플러그인
Collections 데이터 테이블
Database 데이터베이스 작업
DataSourceManager 데이터 소스 관리
ResourceManager 리소스 관리
ACL 권한 제어
Middleware 미들웨어
Cache 캐시
Event 이벤트
Context 요청 컨텍스트
Migration 업그레이드 스크립트
Logger 로그
I18n 국제화
Command 커맨드 라인
CronJobManager 예약 작업 관리
Test 테스트

클라이언트사이드 개발

개요
Plugin 플러그인
Context 컨텍스트
Router 라우터
ACL 권한 제어
DataSourceManager 데이터 소스 관리
Resource 리소스
Request 요청
Styles & Themes 스타일 & 테마
Logger 로그
I18n 국제화
Test 테스트

기타

플러그인 업그레이드 가이드
언어 목록
의존성 관리
빌드
Previous PageResource 리소스
Next PageStyles & Themes 스타일 & 테마
TIP

이 문서는 AI로 번역되었습니다. 부정확한 내용이 있을 경우 영어 버전을 참조하세요

#요청

NocoBase는 Axios를 기반으로 래핑된 APIClient를 제공하여, Context를 얻을 수 있는 모든 곳에서 HTTP 요청을 보낼 수 있도록 합니다.

Context를 얻을 수 있는 일반적인 위치는 다음과 같습니다:

  • app.context
  • engine.context
  • plugin.context
  • model.context

#ctx.api.request()

ctx.api.request()는 요청을 보내는 가장 일반적인 메서드입니다. 매개변수와 반환 값은 axios.request()와 완전히 동일합니다.

request<T = any, R = AxiosResponse<T>, D = any>(
  config: AxiosRequestConfig<D>,
): Promise<R>;

기본 사용법

await ctx.api.request({
  url: 'users:list',
  method: 'get',
});

표준 Axios 요청 설정을 직접 사용할 수 있습니다:

await ctx.api.request({
  url: 'users:create',
  method: 'post',
  data: {
    name: 'Tao Tao',
  },
});

#ctx.api.axios

ctx.api.axios는 AxiosInstance 인스턴스로, 이를 통해 전역 기본 설정을 수정하거나 요청 인터셉터를 추가할 수 있습니다.

기본 설정 수정

axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

더 많은 사용 가능한 설정은 Axios 기본 설정을 참조하세요.

#요청 및 응답 인터셉터

인터셉터를 사용하면 요청이 전송되기 전이나 응답이 반환된 후에 처리할 수 있습니다. 예를 들어, 요청 헤더를 일관되게 추가하거나, 매개변수를 직렬화하거나, 통일된 오류 메시지를 표시할 수 있습니다.

#요청 인터셉터 예시

// qs를 사용하여 params 매개변수 직렬화
axios.interceptors.request.use((config) => {
  config.paramsSerializer = (params) =>
    qs.stringify(params, {
      strictNullHandling: true,
      arrayFormat: 'brackets',
    });
  return config;
});

// 사용자 정의 요청 헤더
axios.interceptors.request.use((config) => {
  config.headers['Authorization'] = `Bearer token123`;
  config.headers['X-Hostname'] = 'localhost';
  config.headers['X-Timezone'] = '+08:00';
  config.headers['X-Locale'] = 'zh-CN';
  config.headers['X-Role'] = 'admin';
  config.headers['X-Authenticator'] = 'basic';
  config.headers['X-App'] = 'sub1';
  return config;
});

#응답 인터셉터 예시

axios.interceptors.response.use(
  (response) => response,
  (error) => {
    // 요청 실패 시, 통일된 알림 메시지 표시
    ctx.notification.error({
      message: '요청 응답 오류',
    });
    return Promise.reject(error);
  },
);

#NocoBase 서버 사용자 정의 요청 헤더

다음은 NocoBase 서버에서 지원하는 사용자 정의 요청 헤더로, 다중 애플리케이션, 국제화, 다중 역할 또는 다중 인증 시나리오에 사용될 수 있습니다.

헤더설명
X-App다중 애플리케이션 시나리오에서 현재 접근하는 애플리케이션을 지정합니다.
X-Locale현재 언어 (예: zh-CN, en-US)
X-Hostname클라이언트 호스트 이름
X-Timezone클라이언트 시간대 (예: +08:00)
X-Role현재 역할
X-Authenticator현재 사용자 인증 방식

💡 팁
이러한 요청 헤더는 일반적으로 인터셉터에 의해 자동으로 주입되므로 수동으로 설정할 필요가 없습니다. 특정 시나리오(예: 테스트 환경 또는 다중 인스턴스 시나리오)에서만 수동으로 추가해야 합니다.

#컴포넌트에서 사용

React 컴포넌트에서 useFlowContext()를 통해 컨텍스트 객체를 얻은 다음 ctx.api를 호출하여 요청을 보낼 수 있습니다.

import { useFlowContext } from '@nocobase/client';

const MyComponent = () => {
  const ctx = useFlowContext();

  const fetchData = async () => {
    const response = await ctx.api.request({
      url: '/api/posts',
      method: 'get',
    });
    console.log(response.data);
  };

  useEffect(() => {
    fetchData();
  }, []);

  return <div>로딩 중...</div>;
};

#ahooks의 useRequest와 함께 사용

실제 개발에서는 ahooks에서 제공하는 useRequest Hook을 사용하여 요청의 생명 주기와 상태를 더 편리하게 처리할 수 있습니다.

import { useFlowContext } from '@nocobase/client';
import { useRequest } from 'ahooks';

const MyComponent = () => {
  const ctx = useFlowContext();

  const { data, loading, error, refresh } = useRequest(() =>
    ctx.api.request({
      url: 'posts:list',
      method: 'get',
    }),
  );

  if (loading) return <div>로딩 중...</div>;
  if (error) return <div>요청 오류: {error.message}</div>;

  return (
    <div>
      <button onClick={refresh}>새로고침</button>
      <pre>{JSON.stringify(data?.data, null, 2)}</pre>
    </div>
  );
};

이 방식은 요청 로직을 더욱 선언적으로 만들고, 로딩 상태, 오류 처리 및 새로고침 로직을 자동으로 관리하여 컴포넌트에서 사용하기에 매우 적합합니다.