요청 핸들러를 사용하여 HTTP 요청을 통해 함수를 트리거할 수 있습니다. 이렇게 하면 GET
, POST
, PUT
, DELETE
, OPTIONS
등 지원되는 HTTP 메서드를 통해 함수를 호출할 수 있습니다.
추가 HTTP 옵션
옵션 | 설명 |
---|---|
region |
HTTP 함수는 단일 리전과 여러 리전을 지정할 수 있습니다. 여러 리전이 지정되면 리전별로 별도의 함수 인스턴스가 배포됩니다. |
timeoutSeconds (Python의 경우 timeout_sec ) |
HTTP 함수에서 최대 1시간의 제한 시간을 지정할 수 있습니다. |
cors |
HTTP 함수가 CORS 정책을 지정할 수 있습니다. true 로 설정하면 모든 출처가 허용되고, string , regex , array 를 설정하면 허용된 출처를 지정할 수 있습니다. 명시적으로 설정하지 않으면 기본값은 false/CORS 정책 없음입니다. |
CORS 구성(교차 출처 리소스 공유)
cors
옵션을 사용하여 함수에 액세스할 수 있는 출처를 관리하세요. 기본적으로 HTTP 함수에는 CORS가 구성되어 있지 않습니다. 즉, 함수에 관한 교차 출처 요청으로 인해 이 오류가 발생합니다.
request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
함수의 cors
옵션을 false
로 설정하여 CORS를 명시적으로 사용 중지할 수도 있습니다.
일부 교차 출처 요청만 허용하려면 허용하는 특정 도메인 또는 정규 표현식의 목록을 전달하면 됩니다. 예를 들어 개발자가 firebase.com
및 flutter.com
도메인을 소유한 경우, firebase.com
에 여러 하위 도메인이 있을 수 있으므로 cors
옵션을 [/firebase\.com$/, 'flutter.com']
(Node.js의 경우) 또는 [r'firebase\.com$', r'https://flutter\.com']
(Python의 경우)으로 설정해야 할 수 있습니다.
Node.js
const { onRequest } = require("firebase-functions/v2/https");
exports.sayHello = onRequest(
{ cors: [/firebase\.com$/, "flutter.com"] },
(req, res) => {
res.status(200).send("Hello world!");
}
);
Python
from firebase_functions import https_fn, options
@https_fn.on_request(
cors=options.CorsOptions(
cors_origins=[r"firebase\.com$", r"https://flutter\.com"],
cors_methods=["get", "post"],
)
)
def say_hello(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello world!")
함수를 공개적으로 사용할 수 있어야 하는 경우(예: 공개 API 또는 웹사이트를 제공하는 경우) cors
정책을 true
로 설정하세요.
HTTP 요청으로 함수 트리거
플랫폼의 요청 핸들러(onRequest()
또는 on_request
)를 사용하여 HTTP 이벤트를 처리하는 함수를 만듭니다. 이 섹션의 예시는 함수 엔드포인트로 HTTP GET
요청을 보낼 때 트리거되는 '시간 서버' 샘플을 기반으로 합니다. 샘플 함수는 현재 서버 시간을 가져오고, URL 쿼리 매개변수에 지정된 대로 시간 형식을 지정하고, HTTP 응답으로 결과를 보냅니다.
요청 및 응답 객체 사용
요청 객체는 클라이언트에서 보낸 HTTP 요청 속성에 액세스할 수 있는 권한을 부여하고 응답 객체는 클라이언트로 응답을 다시 보내는 방법을 제공합니다.
Node.js
exports.date = onRequest( {timeoutSeconds: 1200, region: ["us-west1", "us-east1"]}, (req, res) => { // ... });
Python
@https_fn.on_request(cors=options.CorsOptions(cors_origins="*", cors_methods=["get", "post"]))
def date(req: https_fn.Request) -> https_fn.Response:
"""Get the server's local date and time."""
기존 Express 또는 Flask 앱 사용
앱을 요청 핸들러의 인수로 사용하면 전체 앱을 HTTP 함수에 전달할 수 있습니다.
Node.js
const { onRequest } = require('firebase-functions/v2/https');
const express = require('express');
const app = express();
// Add middleware to authenticate requests
app.use(myMiddleware);
// build multiple CRUD interfaces:
app.get('/:id', (req, res) => res.send(Widgets.getById(req.params.id)));
app.post('/', (req, res) => res.send(Widgets.create()));
app.put('/:id', (req, res) => res.send(Widgets.update(req.params.id, req.body)));
app.delete('/:id', (req, res) => res.send(Widgets.delete(req.params.id)));
app.get('/', (req, res) => res.send(Widgets.list()));
// Expose Express API as a single Cloud Function:
exports.widgets = onRequest(app);
Python
from firebase_admin import initialize_app, db
from firebase_functions import https_fn
import flask
initialize_app()
app = flask.Flask(__name__)
# Build multiple CRUD interfaces:
@app.get("/widgets")
@app.get("/widgets/<id>")
def get_widget(id=None):
if id is not None:
return db.reference(f"/widgets/{id}").get()
else:
return db.reference("/widgets").get()
@app.post("/widgets")
def add_widget():
new_widget = flask.request.get_data(as_text=True)
db.reference("/widgets").push(new_widget)
return flask.Response(status=201, response="Added widget")
# Expose Flask app as a single Cloud Function:
@https_fn.on_request()
def httpsflaskexample(req: https_fn.Request) -> https_fn.Response:
with app.request_context(req.environ):
return app.full_dispatch_request()
HTTP 함수 호출
HTTP 함수를 배포한 후 함수의 고유 URL을 통해 함수를 호출할 수 있습니다. 배포 후 CLI의 정확한 URL 출력을 사용합니다.
예를 들어 date()
를 호출하는 URL은 다음과 같습니다.
https://us-central1-<project-id>.cloudfunctions.net/date
Express 및 Flask 앱 라우팅에서는 정의한 앱의 URL 경로에 함수 이름이 프리픽스로 추가됩니다.
요청의 값 읽기
date()
함수 예시에서는 함수가 URL 매개변수와 본문에서 모두 format
값을 테스트하여 사용할 날짜 및 시간 형식을 설정합니다.
Node.js
let format = req.query.format; format = req.body.format;
Python
format = req.args["format"] if "format" in req.args else None
HTTP 함수 종료
서버 시간을 가져오고 형식을 지정한 후 date()
함수가 HTTP 응답으로 결과를 전송하며 종료됩니다.
Node.js
항상 send()
, redirect()
또는 end()
로 HTTP 함수를 종료합니다. 그렇지 않으면 함수가 계속 실행되고 시스템에 의해 강제로 종료될 수 있습니다. 동기, 비동기, 프로미스도 참조하세요.
const formattedDate = moment().format(`${format}`); logger.log("Sending formatted date:", formattedDate); res.status(200).send(formattedDate);
Python
formatted_date = datetime.now().strftime(format)
print(f"Sending Formatted date: {formatted_date}")
return https_fn.Response(formatted_date)
Firebase 호스팅 통합
HTTP 함수를 Firebase Hosting에 연결할 수 있습니다. Firebase Hosting 사이트의 요청은 특정 HTTP 함수로 프록시 처리될 수 있습니다. 이를 통해 HTTP 함수로 커스텀 도메인을 사용할 수도 있습니다. Cloud Functions를 Firebase Hosting에 연결하는 방법에 대해 자세히 알아보세요.