POSTMAN – Pre-request script

POSTMAN 除了可以發送 request 到 server 之外,也有提供 pre-request script 的功能,讓我們可以撰寫 script 來進行一連串的測試。

舉個例子,我們有三支 API,邏輯為 名稱(Request body)【Response body】:

  • 登入(帳號、密碼)【Token】
  • 取得使用者的消費紀錄列表(Token)【Array<Receipt ID>】
  • 取得單筆消費紀錄(Receipt ID)【Receipt】

在沒有撰寫 pre-request 之前若要取得 Receipt 的話,我們得要先呼叫 登入,接著手動複製 Token 到 取得使用者的消費紀錄列表 的 request body 裡頭,然後再複製⋯⋯(你們應該懂)

這邊就來教教如何先寫好 script,之後只要按最後你想得到的那支 API 就行了!

let account = 'account'
let password = 'password'
let index = 0

pm.sendRequest({
    url: 'https://Archie.tw/login?account=' + account + '&password=' + password,
    method: 'get'
}, function(err, response) {
    let token = response.json().token;
    pm.sendRequest({
        url: 'https://Archie.tw/getReceiptList?token=' + token,
        method: 'get'
    }, function(err, response) {
        pm.environment.set("receiptIdentifier", response.receiptIdentifier);
    });
});

接著在 Params / Body 那邊就可以使用剛剛所定義的環境變數({{receiptIdentifier}})了!

然後請不要真的打範例的 url,是不會有東西回給你的(真的)。

Firebase Cloud Functions with Database and Messaging

Cloud Functions

Firebase 一直以來便是以 serverless 為主要的方向,
而 Functions 則是一個十分有趣的功能;
它可以自動地隨著事件的回應,如資料庫的異動或是收到 HTTP 的 requests 時,執行程式碼。

其中一個重點是,我們也不需要去管理或是 scale 伺服器。

Triggers

  • Cloud Firestore Triggers
  • Realtime Database Triggers
  • Firebase Authentication Triggers
  • Google Analytics for Firebase Triggers
  • Crashlytics Triggers
  • Cloud Storage Triggers
  • Cloud Pub/Sub Triggers
  • HTTP Triggers

範例

需求

Realtime Database 底下的資料有異動的話,進行推播

直接上 Code
const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

exports.updateTodayNews = functions.database.ref('/today/{newsCategory}/updatedTime').onWrite(event => {
    const newsCategory = event.params.newsCategory;

    return admin.database().ref(`/today/${newsCategory}`).once('value').then((snapshot) => {
        if (!snapshot.hasChildren()) {
            return console.log('There are no notification tokens to send to.');
        }
        const title = snapshot.child('title').val();
        const body = snapshot.child('body').val();

        // Notification details.
        const payload = {
          notification: {
            title: title,
            body: body
          }
        };
        if (!snapshot.child('fcmTokens').hasChildren()) {
            return console.log('There are no notification tokens to send to.');
        }
        const tokens = Object.keys(snapshot.child('fcmTokens').val());
        const pushTokens = tokens.filter(key => {
            return snapshot.child('fcmTokens').child(key).val();
        });
        return admin.messaging().sendToDevice(pushTokens, payload)
        .then(function (response) {
            console.log('successfully sent message:', response);
        })
        .catch(function (error) {
            console.log('Error sending message:', error);
        });
    });
});

簡單解說

exports 後面加上這支 function 的名稱,如我們這邊則為 updateTodayNews
而 {newsCategory} 則是變數,以範例來說:
只要 /today/ 底下的任何物件 /updatedTime 又被寫入的話,則會觸發 function。

宣告 admin 是為了使用 Firebase 其他的功能,如這邊是使用到 messaging 和 database。

當 admin.database 得到資料回來後,再使用 admin.messaging().sendToDevice 來進行推播的發送。