HTTP istekleri aracılığıyla çağrı işlevleri


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

Bu sayfadaki örnekler, işlevin 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.

Bir işlevi HTTP isteğiyle tetikleyin

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

Ekspres istek ve yanıt nesnelerini kullanma

onRequest() için argüman olarak kullanılan İstek nesnesi, istemci tarafından gönderilen HTTP isteğinin özelliklerine erişmenizi sağlar ve Response nesnesi, istemciye bir yanıt göndermenin bir yolunu sunar.

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

Mevcut Express uygulamalarını kullanma

App'ı onRequest() için argüman olarak kullanarak, tam bir Express uygulamasını bir HTTP işlevine aktarabilirsiniz. Ortak kod, 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);

Bir HTTP işlevini çağırma

Bir HTTP işlevini dağıttıktan sonra, onu 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 şuna benzer:

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.

Ekspres uygulama yönlendirmeyle işlev adı, tanımladığınız uygulamadaki URL yollarına önek olarak eklenir. Örneğin, yukarıdaki Express uygulaması örneğinde alıcıyı çağıracak URL şuna benzer:

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

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

Cloud Functions ile ara yazılım modüllerini kullanın

Çerez desteği veya CORS gibi şeyler için ara 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, () => {
  // ...
});

İstekteki değerleri oku

Aşağıdaki tabloda bazı yaygın senaryolar listelenmektedir:

İçerik türü Talep Gövdesi Davranış
application/json '{"name":"John"}' request.body.name 'John'a eşittir
application/octet-stream 'benim metnim' request.body '6d792074657874'e eşittir (isteğin ham baytları; Node.js Buffer belgelerine bakın)
text/plain 'benim metnim' request.body 'benim metnim'e eşittir
application/x-www-form-urlencoded 'isim=John' request.body.name 'John'a eşittir

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

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"}'

daha sonra gönderilen veriler şu şekilde gerçekleştirilecektir:

Özellik/Yöntem Değer
req.method "POSTALAMAK"
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 bir format değeri açısından test eder:

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

HTTP İşlevlerini Sonlandır

Bir HTTP işlevini her zaman send() , redirect() veya end() ile sonlandırın. Aksi halde işleviniz çalışmaya devam edebilir ve sistem tarafından zorla sonlandırılabilir. Ayrıca bkz. Sync, Async ve Promises .

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

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

HTTP İşlevlerini Firebase Hosting'e Bağlama

Firebase Hosting'e bir HTTP işlevi bağlayabilirsiniz. Firebase Barındırma sitenizdeki istekler, belirli HTTP işlevlerine proxy olarak yönlendirilebilir. Bu aynı zamanda kendi özel etki 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.