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


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

Bu sayfadaki örnekler, işlevler uç noktasına bir HTTP GET isteği gönderdiğinizde tetiklenen bir örnek işlevi temel alı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 işlev tetikleme

HTTP etkinliklerini işleyen bir işlev oluşturmak için functions.https öğesini 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() bağımsız değişkeni olarak Uygulama'yı kullanarak bir HTTP işlevine tam bir Express uygulaması aktarabilirsiniz. Ortak metin kodu, 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 kendi benzersiz URL'si üzerinden çağırabilirsiniz. URL aşağıdakileri sırayla içerir:

  • İşlevinizi dağıttığınız bölge (veya bölgeler). Ağ gecikmesini en aza indirmek için bazı üretim işlevlerinin konum değerini açıkça ayarlamasının gerekmesi mümkündür.
  • Firebase proje kimliğiniz
  • cloudfunctions.net
  • İşlevinizin adı

Örneğin, date() işlevini çağıracak URL şu şekilde 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 arayabilirsiniz.

Ara yazılım modüllerini Cloud Functions ile kullanma

Çerez desteği veya CORS gibi şeyler için orta katman bağımlılıkları eklemeniz gerekiyorsa 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 "Can" değerine eşit
application/octet-stream 'my text' request.body, "6d792074657874" değerine eşittir (isteğin ham baytları; Node.js Buffer dokümanlarına bakın)
text/plain 'my text' request.body, "metnim" değerine eşit
application/x-www-form-urlencoded 'name=John' request.body.name "Can" değerine eşit

Bu ayrıştırma işlemi, aşağıdaki gövde ayrıştırıcıları tarafından gerçekleştirilir:

İşlevinizin aşağıdaki istekte bulunarak ç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 aşağıdakiler altında somutlaştırılır:

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

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:

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

HTTP İşlevlerini Sonlandırma

HTTP işlevlerini daima 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 İşlemler ve Sözler başlıklı makaleyi de inceleyin.

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

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

HTTP İşlevlerini Firebase Hosting Hizmetine Bağlama

Firebase Hosting'e bir HTTP işlevi bağlayabilirsiniz. Firebase Hosting sitenizdeki istekler belirli HTTP işlevlerine proxy'lenebilir. Bu ayrıca 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.