45 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
export default defineNuxtPlugin(() => {
 | 
						|
  const config = useRuntimeConfig();
 | 
						|
  const baseURL = `${config.public.apiBase}${config.public.contextPath}`;
 | 
						|
 | 
						|
  const api = $fetch.create({
 | 
						|
    baseURL,
 | 
						|
    credentials: "include",
 | 
						|
    onRequest({ request, options }) {
 | 
						|
      // 1) GET/HEAD가 아니면 body만 넣기 (GET에 body 금지)
 | 
						|
      const method = (options.method ?? "GET").toUpperCase();
 | 
						|
      if (method === "GET" || method === "HEAD") {
 | 
						|
        delete (options as any).body;
 | 
						|
      }
 | 
						|
 | 
						|
      // 2) FormData면 Content-Type 자동 지정 금지
 | 
						|
      const isFormData =
 | 
						|
        typeof FormData !== "undefined" && options.body instanceof FormData;
 | 
						|
      options.headers = {
 | 
						|
        ...(isFormData ? {} : { "Content-Type": "application/json" }),
 | 
						|
        ...(options.headers || {}),
 | 
						|
      };
 | 
						|
 | 
						|
      // 3) SSR 쿠키 포워딩
 | 
						|
      if (import.meta.server) {
 | 
						|
        const cookie = useRequestHeaders(["cookie"])?.cookie;
 | 
						|
        // request가 절대 URL이면 호스트 비교
 | 
						|
        const reqUrl = typeof request === "string" ? request : String(request);
 | 
						|
        const isBackendApi =
 | 
						|
          !reqUrl.startsWith("http") || // 상대경로면 내 API
 | 
						|
          reqUrl.startsWith(baseURL); // 혹은 baseURL과 동일
 | 
						|
 | 
						|
        if (cookie && isBackendApi) {
 | 
						|
          options.headers = { ...(options.headers || {}), cookie } as any;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    },
 | 
						|
    onResponseError({ response }) {
 | 
						|
      // 공통 로깅
 | 
						|
      console.error("[API ERROR]", response.status, response._data);
 | 
						|
    },
 | 
						|
  });
 | 
						|
 | 
						|
  return { provide: { api } };
 | 
						|
});
 |