İşlevleri HTTP istekleriyle çağırma


functions.https kullanarak bir HTTP isteği aracılığıyla bir işlevi tetikleyebilirsiniz. Bu da desteklenen şu HTTP yöntemleri aracılığıyla eşzamanlı bir işlev çağırmanıza olanak tanır: GET, POST, PUT, DELETE ve OPTIONS.

Bu sayfadaki örnekler, işlevler uç noktasına HTTP GET isteği gönderdiğinizde tetiklenen bir örnek işleve dayalıdır. Örnek işlev, geçerli sunucu saatini alır, zamanı bir URL sorgu parametresinde belirtildiği gibi biçimlendirir ve sonucu HTTP yanıtına gönderir.

HTTP isteğiyle bir işlevi tetikleme

HTTP etkinliklerini işleyen bir işlev oluşturmak için functions.https kullanın. HTTP işlevinin etkinlik işleyicisi, Express web çerçevesi tarafından yönetilen yönlendiricileri ve uygulamaları destekleyen onRequest() etkinliğini dinler.

Express istek ve yanıt nesnelerini kullanma

onRequest() için bağımsız değişken olarak kullanılan Request nesnesi, istemci tarafından gönderilen HTTP isteğinin özelliklerine erişmenizi sağlar ve Yanıt nesnesi, istemciye yanıt göndermenin bir yolunu sunar.

exports.date = functions.https.onRequest((req, res) => {
  // ...
});

Mevcut Express uygulamalarını kullanma

onRequest() için bağımsız değişken olarak Uygulama'yı kullanarak, tam bir Express uygulamasını bir HTTP işlevine geçirebilirsiniz. Ortak metin kodu, aşağıdaki gibi ara katman yazılımına taşınabilir:

const express = require('express');
const cors = require('cors');

const app = express();

// Automatically allow cross-origin requests
app.use(cors({ origin: true }));

// 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 = functions.https.onRequest(app);

HTTP işlevi çağırma

Bir HTTP işlevini dağıttıktan sonra, işlevi kendi benzersiz URL'si ile çağırabilirsiniz. URL'de sırayla şunlar bulunur:

  • İşlevinizi dağıttığınız bölge (veya bölgeler). Bazı üretim işlevlerinin ağ gecikmesini en aza indirmek için konumu açıkça ayarlaması gerekebilir.
  • Firebase proje kimliğiniz
  • cloudfunctions.net
  • İşlevinizin adı

Örneğin, date() çağrısı yapılacak URL aşağıdaki gibi görünür:

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

İşlevleri dağıtırken izin hatalarıyla karşılaşırsanız dağıtım komutlarını çalıştıran kullanıcıya uygun IAM rollerinin atandığından emin olun.

Express uygulama yönlendirmesiyle, işlev adı, tanımladığınız uygulamadaki URL yollarına ön ek olarak eklenir. Örneğin, yukarıdaki Express uygulaması örneğinde alıcıyı çağıracak URL aşağıdaki gibi görünür:

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

Bir güvenlik duvarı veya IP filtresinin arkasında HTTP işlevleri çağırıyorsanız Google'ın HTTP işlevlerini sunmak için kullandığı IP adreslerini arayabilirsiniz.

Cloud Functions ile ara katman yazılımı modüllerini kullanma

Çerez desteği veya CORS gibi şeyler için ara katman yazılımı bağımlılıkları yerleştirmeniz gerekirse bunları işlev içinde çağırın. Örneğin, CORS desteğini etkinleştirmek için aşağıdaki bloğu ekleyin:

// Enable CORS using the `cors` express middleware.
cors(req, res, () => {
  // ...
});

İstekteki değerleri okuma

Aşağıdaki tabloda sık karşılaşılan bazı senaryolar listelenmiştir:

İçerik Türü İstek Metni Davranış
application/json '{"name":"John"}' request.body.name eşittir "Can"
application/octet-stream "benim metnim" request.body değeri "6d792074657874"e eşittir (isteğin ham baytları; Node.js Arabellek dokümanlarına bakın)
text/plain "benim metnim" request.body şuna eşittir: "benim metnim"
application/x-www-form-urlencoded "name=Can" request.body.name eşittir "Can"

Bu ayrıştırma işlemi, aşağıdaki gövde ayrıştırıcılar tarafından yapılır:

İşlevinizin aşağıdaki istekle çağrıldığını varsayalım:

curl -X POST -H "Content-Type:application/json" -H "X-MyHeader: 123" YOUR_HTTP_TRIGGER_ENDPOINT?foo=baz -d '{"text":"something"}'

gönderilen veriler şunun altında somutlaştırılır:

Özellik/Yöntem Değer
req.method "YAYINLA"
req.get('x-myheader') "123"
req.query.foo "baz"
req.body.text "bir şey"
req.rawBody İsteğin ham (ayrıştırılmamış) baytları

date() işlevi örneğinde, işlev kullanılacak tarih/saat biçimini ayarlamak için hem URL parametresini hem de gövdesini bir format değeri için test eder:

let format = req.query.format;
format = req.body.format;

HTTP İşlevlerini Sonlandırma

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 Vaatler bölümünü de inceleyin.

Node.js moment modülünü kullanarak sunucu zamanını alıp biçimlendirdikten sonra date() işlevi, sonucu HTTP yanıtında göndererek sonlandırır:

const formattedDate = moment().format(`${format}`);
functions.logger.log('Sending Formatted date:', formattedDate);
res.status(200).send(formattedDate);

HTTP Functions'ı Firebase Hosting'e Bağlama

Firebase Hosting'e HTTP işlevi bağlayabilirsiniz. Firebase Hosting sitenizdeki istekler, belirli HTTP işlevlerine proxy ile yönlendirilebilir. Bu ayrıca, kendi özel alanınızı bir HTTP işleviyle kullanmanıza da olanak tanır. Cloud Functions'ı Firebase Hosting'e bağlama hakkında daha fazla bilgi edinin.