functions.https
kullanarak bir işlevi HTTP isteğiyle tetikleyebilirsiniz. Bu sayede, aşağıdaki desteklenen HTTP yöntemleri aracılığıyla senkron bir işlevi ç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şleme dayanmaktadır. Örnek işlev, mevcut 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 bir işlevi tetikleme
HTTP etkinliklerini işleyen bir işlev oluşturmak için functions.https
öğesini kullanın. Bir HTTP işlevinin etkinlik işleyicisi, onRequest()
etkinliğini dinler. Bu etkinlik, Express web çerçevesi tarafından yönetilen yönlendiricileri ve uygulamaları destekler.
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öndermenizi sağlar.
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 bir HTTP işlevine tam bir Express uygulaması iletebilirsiniz. Ortak metin kodu, gösterildiği gibi ara yazılıma 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, kendine özgü URL'si üzerinden başlatabilirsiniz. URL sırasıyla şunları içerir:
- İşlevinizi dağıttığınız bölge (veya bölgeler). Bazı üretim işlevlerinde, ağ gecikmesini en aza indirmek için konumun açıkça ayarlanması gerekebilir.
- Firebase proje kimliğiniz
cloudfunctions.net
- İşlevinizin adı
Örneğin, date()
öğesini çağıran 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önlendirme ile işlev adı, tanımladığınız uygulamadaki URL yollarına ön ek olarak eklenir. Örneğin, yukarıdaki Express uygulaması örneğinde getter'ı çağırmak için kullanılan URL şu şekilde görünür:
https://us-central1-<project-id>.cloudfunctions.net/widgets/<id>
Güvenlik duvarı veya IP filtresi arkasında HTTP işlevlerini ç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 öğeler için ara yazılım bağımlılıklarını yerleştirmeniz 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 değeri "Can"a eşit |
application/octet-stream |
"metnim" | request.body eşittir "6d792074657874" (isteğin ham baytları; Node.js Buffer belgelerine bakın) |
text/plain |
"metnim" | request.body , "metnim"e eşit |
application/x-www-form-urlencoded |
"name=John" | request.body.name değeri "Can"a eşit |
Bu ayrıştırma 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"}'
Bu durumda 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 işlenmemiş (ayrıştırılmamış) baytları |
date()
işlevi örneğinde, işlev hem URL parametresini hem de gövdeyi, kullanılacak tarih/saat biçimini ayarlamak için format
değeri açısından test eder:
let format = req.query.format; format = req.body.format;
HTTP iş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. Ayrıca Sync, Async and Promises (Senkronizasyon, Eşzamansız 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 tamamlanır:
const formattedDate = moment().format(`${format}`); functions.logger.log('Sending Formatted date:', formattedDate); res.status(200).send(formattedDate);
HTTP işlevlerini Firebase Hosting uygulamasına bağlama
Firebase Hosting'ya bir HTTP işlevi bağlayabilirsiniz. Firebase Hosting sitenizdeki istekler belirli HTTP işlevlerine yönlendirilebilir. Bu sayede, HTTP işleviyle kendi özel alanınızı da kullanabilirsiniz. Cloud Functions ile Firebase Hosting'ı bağlama hakkında daha fazla bilgi edinin.