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

İstek işleyici içeren bir HTTP isteğiyle işlev tetikleyebilirsiniz. Bu sayede, şu desteklenen HTTP yöntemlerini kullanarak bir işlevi çağırabilirsiniz: GET, POST, PUT, DELETE ve OPTIONS.

Bu kılavuzda, Node.js ve Python için başlangıç kılavuzumuzda açıklanan kurulum görevlerini veya deneysel Dart SDK'sı için kurulum görevlerini tamamladığınız varsayılmaktadır.

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 için bir saate kadar zaman aşımı süresi belirtilebilir.
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 ayarlanmamışsa varsayılan olarak false/CORS politikası yok değerine ayarlanır.

CORS'yi (çapraz kaynaklı kaynak paylaşımı) yapılandırma

İşlevinize hangi kaynakların erişebileceğini kontrol etmek için cors seçeneğini kullanın. Varsayılan olarak HTTP işlevlerinde CORS yapılandırılmaz. Bu nedenle, işlevinize gönderilen tüm çapraz kaynak istekleri şu hatayla sonuçlanır:

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.

Tüm çapraz kaynak isteklerine değil de 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 alan adının birçok alt alan adı olabiliyorsa cors seçeneğini gösterildiği gibi 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!")

Dart (deneysel)

import 'package:firebase_functions/firebase_functions.dart';

void main() {
  runFunctions((firebase) {
    firebase.https.onRequest(
      name: 'sayHello',
      options: const HttpsOptions(
        cors: Cors([RegExp(r'^https:\/\/firebase\.com$'), 'https://flutter.com']),
      ),
      (request) async => Response(200, body: '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 işlev tetikleme

HTTP etkinliklerini işleyen bir işlev oluşturmak için platformunuzun istek işleyicisini kullanın. Bu bölümdeki örnekler, işlev uç noktasına bir HTTP GET isteği gönderdiğinizde tetiklenen bir "zaman sunucusu" örneğine dayanır. Örnek işlev, geçerli 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."""

Dart (deneysel)

void main() {
  runFunctions((firebase) {
    firebase.https.onRequest(name: 'date', (request) async {

Mevcut Express veya Flask uygulamalarını kullanma

Uygulamayı istek işleyicinin bağımsız değişkeni olarak 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şlevini çağırma

Bir HTTP işlevini dağıttıktan sonra kendi benzersiz URL'si üzerinden çağırabilirsiniz. Dağıtımdan sonra CLI'dan alınan tam URL çıkışını kullanın.

Örneğin, date() uygulamasını çağırmak için kullanılan URL şu şekildedir:

https://us-central1-<project-id>.cloudfunctions.net/date

Express ve Flask uygulama yönlendirmesiyle işlev adı, tanımladığınız uygulamadaki URL yollarına ön ek olarak eklenir.

İstekten değerleri okuma

date() işlevi ö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

Dart (deneysel)

var format = request.url.queryParameters['format'];
final bodyString = await request.readAsString();
try {
  if (bodyString.isNotEmpty) {
    final body = jsonDecode(bodyString) as Map<String, dynamic>;
    format = body['format'] as String?;
  }
} catch (e) {
  return Response.badRequest(body: 'invalid JSON');
}

HTTP İşlevlerini Sonlandırma

Sunucu zamanını alıp biçimlendirdikten 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. Senkronizasyon, Eşzamansız ve Promise'ler bölümüne de bakın.

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)

Dart (deneysel)

final formattedDate = DateFormat(format).format(DateTime.now());
print('Sending formatted date: $formattedDate');
return Response.ok(formattedDate);

Firebase Hosting ile entegrasyon

Firebase Hosting hizmetine bir HTTP işlevi bağlayabilirsiniz. Firebase Hosting sitenizdeki istekler, belirli HTTP işlevlerine yönlendirilebilir. Bu sayede, kendi özel alanınızı bir HTTP işleviyle de kullanabilirsiniz. Cloud Functions ile Firebase Hosting bağlantısı oluşturma hakkında daha fazla bilgi edinin.