functions.https kullanarak bir HTTP isteği aracılığıyla işlev tetikleyebilirsiniz. Bu sayede, şu desteklenen HTTP yöntemleri aracılığıyla eşzamanlı bir işlevi çağırabilirsiniz: GET, POST, PUT, DELETE ve OPTIONS.
Bu sayfadaki örnekler, işlev uç noktasına bir HTTP GET isteği gönderdiğinizde tetiklenen örnek bir işlevi temel alı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.
HTTP isteğiyle işlev 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. Response nesnesi ise istemciye yanıt göndermenize olanak tanır.
exports.date = functions.https.onRequest((req, res) => { // ... });
Mevcut Express uygulamalarını kullanma
onRequest() için bağımsız değişken olarak App'i kullanarak tam bir Express uygulamasını HTTP işlevine iletebilirsiniz. Ortak metin kodu, 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şlevini çağırma
Bir HTTP işlevini dağıttıktan sonra kendi benzersiz URL'si üzerinden ç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() uygulamasını çağırmak için kullanılan URL şu şekildedir:
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, tanımladığınız uygulamadaki URL yollarına işlev adı ön ek olarak eklenir. Örneğin, yukarıdaki Express uygulaması örneğinde alıcıyı çağırma URL'si şu şekildedir:
https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>
HTTP işlevlerini bir güvenlik duvarı veya IP filtresinin arkasından ç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ı 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şittir |
application/octet-stream |
'my text' | request.body, "6d792074657874" değerine eşittir (isteğin ham baytları; Node.js Buffer belgelerine bakın) |
text/plain |
'metnim' | request.body, "metnim"e eşittir |
application/x-www-form-urlencoded |
'name=John' | request.body.name, "Can" değerine eşittir |
Bu ayrıştırma işlemi aşağıdaki gövde ayrıştırıcıları tarafından yapılır:
- JSON gövde ayrıştırıcısı
- Ham gövde ayrıştırıcısı
- Metin gövdesi ayrıştırıcısı
- URL biçiminde kodlanmış form gövdesi ayrıştırıcısı
İş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 şu konumda 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 |
"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ö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 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.
Node.js moment modülünü kullanarak sunucu saatini alıp biçimlendirdikten sonra date() işlevi, sonucu HTTP yanıtında göndererek tamamlanır:
const formattedDate = moment().format(`${format}`); functions.logger.log('Sending Formatted date:', formattedDate); res.status(200).send(formattedDate);
HTTP işlevlerini Firebase Hosting hizmetine bağlama
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.