İşlevleri HTTP istekleriyle çağırma


functions.https kullanarak bir işlevi HTTP isteği aracılığıyla tetikleyebilirsiniz. Böylece, desteklenen şu HTTP yöntemleriyle eşzamanlı bir işlev çağırabilirsiniz: GET, POST, PUT, DELETE ve OPTIONS.

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

HTTP isteğiyle bir işlevi tetikleme

HTTP etkinliklerini işleyen bir işlev oluşturmak için functions.https işlevini 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şkenler olarak kullanılan Request nesnesi, istemci tarafından gönderilen HTTP isteğinin özelliklerine erişmenizi sağlar. Response nesnesi ise istemciye yanıt göndermek için kullanabileceğiniz bir yöntem sunar.

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

Mevcut Express uygulamalarını kullanma

onRequest() için bağımsız değişken olarak App kullanarak tam Express uygulamasını bir HTTP işlevine aktarabilirsiniz. Ortak kod, aşağıda gösterildiği 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 aracılığıyla çağırabilirsiniz. URL sırasıyla aşağıdakileri içerir:

  • İş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() öğesini çağıracak URL şöyle 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önlendirmesi sayesinde işlev adı, tanımladığınız uygulamadaki URL yollarına bir ön ek olarak eklenir. Örneğin, yukarıdaki Express uygulama örneğinde alıcıyı çağıracak URL şöyle görünür:

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

HTTP işlevlerini bir güvenlik duvarı veya IP filtresinin arkasında çağırırsanız Google'ın HTTP işlevlerini sunmak için kullandığı IP adreslerini araabilirsiniz.

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ı eklemeniz 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, () => {
  // ...
});

İstekten 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, '6d792074657874' değerine eşittir (isteğin işlenmemiş baytları; Node.js Arabelleği dokümanlarına bakın)
text/plain "benim metnim" request.body, "benim metnim"e eşit
application/x-www-form-urlencoded 'ad=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 gerçekleştirilir:

Fonksiyonunuzun 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 şu altında gerçekleştirilecektir:

Ö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ılmamış) baytları

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 için test eder:

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

HTTP İşlevlerini Sonlandırma

Bir HTTP işlevini 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 bkz. Senkronizasyon, Eşzamansız ve Sözler.

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 karara bağlanı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 bir HTTP işlevi bağlayabilirsiniz. Firebase Hosting sitenizdeki istekler, belirli HTTP işlevlerine proxy uygulanabilir. 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.