HTTP istekleri aracılığıyla işlev çağırma


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.