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 senkronize bir işlevi çağırmanıza olanak tanır: GET , POST , PUT , DELETE ve OPTIONS .

Bu sayfadaki örnekler, işlevlerin 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 gibi biçimlendirir ve sonucu HTTP yanıtında gönderir.

HTTP isteğiyle bir işlevi 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 bağımsız değişken olarak kullanılan Request nesnesi, istemci tarafından gönderilen HTTP isteğinin özelliklerine erişmenizi sağlar ve Response nesnesi, istemciye yanıt göndermenin bir yolunu sunar.

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

Mevcut Express uygulamalarını kullanma

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

Bir HTTP işlevini dağıttıktan sonra, onu kendi benzersiz URL'si aracılığıyla çağırabilirsiniz. URL, sırayla aşağıdakileri içerir:

  • İşlevinizi konuşlandırdığı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() işlevini ç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önlendirmesiyle işlev adı, tanımladığınız uygulamadaki URL yollarına önek olarak eklenir. Örneğin, yukarıdaki Ekspres uygulama ö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ında çalıştırırsanız, Google'ın HTTP işlevlerini sunmak için kullandığı IP adreslerine bakabilirsiniz .

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ı enjekte etmeniz gerekirse, bunları işlev içinden ç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 oku

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

İçerik türü İstek Gövdesi Davranış
application/json '{"name":"John"}' request.body.name eşittir 'John'
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şittir
application/x-www-form-urlencoded "isim = Can" request.body.name eşittir 'John'

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

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

o zaman gönderilen veriler aşağıdakiler altında 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şlev örneğinde işlev, kullanılacak tarih/saat biçimini ayarlamak için hem URL parametresini hem de gövdeyi bir format değeri için 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 fonksiyonunuz çalışmaya devam edebilir ve sistem tarafından zorla sonlandırılabilir. Ayrıca bkz. Eşitleme, Eşzamansız ve Sözler .

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

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

HTTP İşlevlerini Firebase Barındırmaya Bağlama

Firebase Hosting'e bir HTTP işlevi bağlayabilirsiniz. Firebase Barındırma sitenizdeki istekler, belirli HTTP işlevlerine proxy olarak gönderilebilir. Bu ayrıca kendi özel etki alanınızı bir HTTP işleviyle kullanmanıza olanak tanır. Cloud Functions'ı Firebase Hosting'e bağlama hakkında daha fazla bilgi edinin.