Bir işlevi, istek işleyici içeren bir HTTP isteği aracılığıyla tetikleyebilirsiniz. Bu sayede, GET
, POST
, PUT
, DELETE
ve OPTIONS
gibi desteklenen HTTP yöntemleri aracılığıyla bir işlevi çağırabilirsiniz.
Ek HTTP seçenekleri
Option | Açıklama |
---|---|
region |
HTTP işlevleri, tek bir bölgenin yanı sıra bir dizi bölge de belirtebilir. Birden fazla bölge belirtildiğinde her bölge için ayrı bir işlev örneği dağıtılır. |
timeoutSeconds (Python için timeout_sec ) |
HTTP işlevleri bir saate kadar zaman aşımı belirtebilir. |
cors |
HTTP işlevleri CORS politikalarını belirtebilir. Tüm kaynaklara izin vermek için bu değeri true olarak ayarlayabilir veya izin verilen kaynakları belirtmek için string , regex ya da array olarak ayarlayabilirsiniz. Açıkça belirtilmediği takdirde varsayılan olarak yanlış/CORS politikası yok olur. |
CORS'u (Kaynaklar Arası Kaynak Paylaşımı) yapılandırma
İşlevinize hangi kaynakların erişebileceğini kontrol etmek için cors
seçeneğini kullanın. HTTP işlevlerinde varsayılan olarak CORS yapılandırılmamıştır. Bu, işlevinize yapılan kaynakta çapraz isteklerin aşağıdaki hatayla sonuçlandığı anlamına gelir:
request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
İşleviniz için cors
seçeneğini false
olarak ayarlayarak CORS'u açıkça devre dışı da bırakabilirsiniz.
Kaynaklar arası isteklerin tümüne değil, yalnızca bazılarına izin vermek için izin verilmesi gereken belirli alan adlarının veya normal ifadelerin listesini iletebilirsiniz. Örneğin, firebase.com
ve flutter.com
alan adlarının sahibiyseniz ve firebase.com
'in birçok alt alanı varsa cors
seçeneğini Node.js için [/firebase\.com$/, 'flutter.com']
veya Python için [r'firebase\.com$', r'https://flutter\.com']
olarak ayarlayabilirsiniz:
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!")
İşleviniz herkese açık olarak kullanılabiliyorsa (ör. herkese açık bir API veya web sitesi sunuyorsa) cors
politikasını true
olarak ayarlayın.
HTTP isteğiyle işlev tetikleme
HTTP etkinliklerini işleyen bir işlev oluşturmak için platformunuzun istek işleyicisini (onRequest()
veya on_request
) kullanın. Bu bölümdeki örnekler, işlevler uç noktasına bir HTTP GET
isteği gönderdiğinizde tetiklenen bir "zaman sunucusu" örneğini temel alır. Örnek işlev, mevcut sunucu saatini alır, saati bir URL sorgu parametresinde belirtildiği gibi biçimlendirir ve sonucu HTTP yanıtında gönderir.
İstek ve yanıt nesnelerini kullanma
İstek nesnesi, istemci tarafından gönderilen HTTP isteğinin özelliklerine erişmenizi sağlar. Yanıt nesnesi ise istemciye yanıt göndermenize olanak tanır.
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."""
Mevcut Express veya Flask uygulamalarını kullanma
İstek işleyicinin bağımsız değişkeni olarak uygulamayı kullanarak bir HTTP işlevine tam bir uygulama iletebilirsiniz:
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 işlevi çağırma
Bir HTTP işlevini dağıttıktan sonra kendi benzersiz URL'si üzerinden çağırabilirsiniz. Dağıtım işleminden sonra KSA'dan alınan tam URL çıkışını kullanın.
Örneğin, date()
işlevini çağıracak URL şu şekilde görünür:
https://us-central1-<project-id>.cloudfunctions.net/date
Express ve Flask uygulama yönlendirmesinde, işlev adı, tanımladığınız uygulamadaki URL yollarına ön ek olarak eklenir.
İstekten değerleri okuma
date()
işlev örneğinde işlev, kullanılacak tarih/saat biçimini ayarlamak için hem URL parametresini hem de gövdeyi format
değeri açısından test eder:
Node.js
let format = req.query.format; format = req.body.format;
Python
format = req.args["format"] if "format" in req.args else None
HTTP İşlevlerini Sonlandırma
date()
işlevi, sunucu saatini aldıktan ve biçimlendirdikten sonra sonucu HTTP yanıtında göndererek sona erer:
Node.js
HTTP işlevlerini her zaman send()
, redirect()
veya end()
ile bitirin. Aksi takdirde işleviniz çalışmaya devam edebilir ve sistem tarafından zorla sonlandırılabilir. Senkronizasyon, Eşzamansız ve Sözler başlıklı makaleyi de inceleyin.
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 Hosting ile entegrasyon
Firebase Hosting'e bir HTTP işlevi bağlayabilirsiniz. Firebase Hosting sitenizdeki istekler belirli HTTP işlevlerine proxy'lenebilir. Bu, kendi özel alanınızı bir HTTP işleviyle kullanmanıza da olanak tanır. Cloud Functions'i Firebase Hosting'ye bağlama hakkında daha fazla bilgi edinin.