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

İ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 FunctionsFirebase Hosting'a bağlama hakkında daha fazla bilgi edinin.