İstek işleyici içeren bir HTTP isteğiyle işlev tetikleyebilirsiniz. Bu sayede, desteklenen şu HTTP yöntemleriyle bir işlevi çağırabilirsiniz: GET
, POST
, PUT
, DELETE
ve OPTIONS
.
Ek HTTP seçenekleri
Seçenek | Açıklama |
---|---|
region |
HTTP işlevleri, tek bir bölgenin yanı sıra bir bölge dizisi 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 bunu true olarak ayarlayabilir veya izin verilen kaynakları belirtmek için string , regex ya da array olarak ayarlayabilirsiniz. Açıkça ayarlanmamışsa varsayılan olarak false/no CORS policies (yanlış/CORS politikası yok) olur. |
CORS'yi (Merkezler Arası Kaynak Paylaşımı) yapılandırma
Hangi kaynakların işlevinize erişebileceğini kontrol etmek için cors
seçeneğini kullanın. HTTP işlevlerinde varsayılan olarak CORS yapılandırılmaz. Bu nedenle, işlevinize yapılan tüm kaynaklar arası istekler şu hatayla sonuçlanır:
request has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Ayrıca, işleviniz için cors
seçeneğini false
olarak ayarlayarak CORS'u açıkça devre dışı bırakabilirsiniz.
Tüm kaynaklar arası isteklere 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
alanlarının sahibiyseniz ve firebase.com
alanının birçok alt alanı varsa Node.js için cors
seçeneğini [/firebase\.com$/, 'https://flutter.com']
, Python için ise [r'firebase\.com$', r'https://flutter\.com']
olarak ayarlamak isteyebilirsiniz:
Node.js
const { onRequest } = require("firebase-functions/v2/https");
exports.sayHello = onRequest(
{ cors: [/firebase\.com$/, "https://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!")
İşlevinizin herkese açık olması gerekiyorsa (ör. herkese açık bir API veya web sitesi sunuyorsa) cors
politikasını true
olarak ayarlayın.
HTTP isteğiyle bir işlevi 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ğine dayanmaktadır. Örnek işlev, mevcut sunucu saatini alır, saati bir URL sorgu parametresinde belirtildiği şekilde 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, kendine özgü URL'si üzerinden başlatabilirsiniz. Dağıtımdan sonra KSA'dan alınan tam URL çıkışını kullanın.
Örneğin, date()
öğesini çağırmak için kullanılan 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 önek olarak eklenir.
İstekten değerleri okuma
date()
işlevi örneğinde, işlev hem URL parametresini hem de gövdeyi, kullanılacak tarih/saat biçimini ayarlamak için 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 işlevlerini sonlandırma
Sunucu saati alınarak biçimlendirildikten sonra date()
işlevi, sonucu HTTP yanıtında göndererek tamamlanır:
Node.js
HTTP işlevlerini her zaman send()
, redirect()
veya end()
ile sonlandırın. Aksi takdirde işleviniz çalışmaya devam edebilir ve sistem tarafından zorla sonlandırılabilir. Ayrıca Sync, Async and Promises (Senkronizasyon, Eşzamansızlık 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'ya bir HTTP işlevi bağlayabilirsiniz. Firebase Hosting sitenizdeki istekler belirli HTTP işlevlerine yönlendirilebilir. Bu sayede, HTTP işleviyle kendi özel alanınızı da kullanabilirsiniz. Cloud Functions'ı Firebase Hosting'a bağlama hakkında daha fazla bilgi edinin.