串接 Airtable的 API 開發 iOS App

在之前的文章,我們介紹了如何利用 Airtable 製作 iOS App 連結的後台資料,建立包含電影資料的表單。接下來我們將繼續介紹如何串接它的 API。

連到 Airtable 的 API 網頁

https://airtable.com/api

記得要先登入帳號,然後點選 Movie 查詢電影 API 的說明。

建立和複製 Personal access tokens

依據網頁的說明,為了串接 Airtable API,我們必須先取得 Personal access tokens。

從以下連結建立 token。

點選 Create token。

設定 token 的名字,權限和存取的資料。

Scopes 加入 data.records:read 和 data.records:write。

Access 加入 Movie。

點選 Create token。

複製 token。token 字串只會出現一次,所以記得要複製保存好,之後無法再看到完整 token 字串。

API 的網址

從下圖的說明可知 API 的網址為

https://api.airtable.com/v0/appy8vQI5641oQxpJ/Movie

appy8vQI5641oQxpJ 是我們在 Airtable 上設定的 Movie base 的 id,/ 後接 Movie 表示我們想讀取其中的 Movie table,若有另一個 table,比方 Actor table,網址會變成 https://api.airtable.com/v0/appy8vQI5641oQxpJ/Actor

串接 API

curl 指令的說明如下。

curl https://api.airtable.com/v0/appy8vQI5641oQxpJ/Movie \
-H "Authorization: Bearer YOUR_SECRET_API_TOKEN"

因此我們必須在 http header 包含 token,格式如下

Authorization: Bearer YOUR_SECRET_API_TOKE

假設 token 是 1234abc,透過以下 swift 程式產生的 request 搭配 URLSession 即可抓取電影的 JSON 資料。(token 是假的,請換成自己帳號的 key)

let url = URL(string: "https://api.airtable.com/v0/appy8vQI5641oQxpJ/Movie")!
var request = URLRequest(url: url)
request.setValue("Bearer 1234abc", forHTTPHeaderField: "Authorization")

從以下兩張圖可看出 API 回傳的 JSON 格式。

特別值得一提的是圖片的部分,Airtable 還貼心提供縮圖,包含了 thumbnails 欄位。

資料的排序

Airtable API 提供豐富的參數讓我們調整,比方我們可以加入 sort 控制資料的排序。

以 imdb 排序的網址如下。field 設定欄位名稱,sort[][field]=imdb 表示以欄位 imdb 的內容排序。direction 設定方向,desc 代表大到小,asc 代表小到大,因此 sort[][field]=imdb&sort[][direction]=desc 表示以 imdb 排序,分數高的排在前面。

https://api.airtable.com/v0/appy8vQI5641oQxpJ/Movie?sort[][field]=imdb&sort[][direction]=desc

若有多個排序的條件,則要在 [ ] 傳入數字,比方先比 imdb,再比上映日期。

https://api.airtable.com/v0/appy8vQI5641oQxpJ/Movie?sort[0][field]=imdb&sort[0][direction]=desc&sort[1][field]=releaseDate&sort[1][direction]=desc

資料的搜尋

Airtable 也可進行簡易的資料搜尋,透過參數 filterByFormula。以下 API 將搜尋名字叫靈魂急轉彎的電影,{ } 裡的 name 代表欄位名稱, = 後的字串是內容,因此將搜尋 name 等於靈魂急轉彎的電影。

https://api.airtable.com/v0/appy8vQI5641oQxpJ/Movie?filterByFormula=({name} = '靈魂急轉彎')

關於 filterByFormula 的輸入格式,更多的細節可參考以下連結。

資料的新增

研究文件裡關於 Create records 的說明 & 右邊 curl 的範例。

若是 curl 裡沒有顯示上傳的 JSON 資料,請先在 AirTable 的表格輸入一筆資料,如此 curl 才會顯示上傳的資料。

值得注意的,雖然型別 Attachment 的欄位 image 可以加入圖片,但是我們不能直接上傳圖片,而要上傳檔案的 url。因此若想上傳圖片,請先將圖片傳到其它地方取得圖片網址,然後再將它上傳到 Airtable,比方透過 Imgur API 上傳圖片取得網址。

以下為資料上傳的程式範例

  • 定義上傳的資料型別 & 產生上傳的資料,準備上傳電影再見街貓BOB。(假設已取得圖片網址)
struct MovieBody: Encodable {
let records: [Record]

struct Record: Encodable {

let fields: Fields
}

struct Fields: Encodable {
let name: String
let imdb: Double
let releaseDate: Date
let genre: [String]
let image: [ImageData]
}

struct ImageData: Encodable {
let url: URL
}
}

let date = DateComponents(calendar: .current, year: 2020, month: 12, day: 10).date!
let movieBody = MovieBody(records: [.init(fields: .init(name: "再見街貓BOB", imdb: 6.4, releaseDate: date, genre: ["劇情"], image: [.init(url: URL(string: "https://movies.yahoo.com.tw/i/o/production/movies/November2020/2MiW3a75Wdooxhb4EmWq-800x1154.jpg")!)]))])
  • 產生 request,將資料編碼成 JSON 格式的 data 後存在 httpBody。
let url = URL(string: "https://api.airtable.com/v0/appy8vQI5641oQxpJ/Movie")!
var request = URLRequest(url: url)
request.setValue("Bearer 1234abc", forHTTPHeaderField: "Authorization")
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let encoder = JSONEncoder()
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
encoder.dateEncodingStrategy = .formatted(formatter)
request.httpBody = try? encoder.encode(movieBody)
  • 利用 URLSession 上傳。

寫法 1: 利用 async/await。

Task {
do {
let (data, _) = try await URLSession.shared.data(for: request)
if let content = String(data: data, encoding: .utf8) {
print(content)
}
} catch {
print(error)
}
}

寫法 2: 利用 completion handler。

URLSession.shared.dataTask(with: request) { data, response, error in
if let data,
let content = String(data: data, encoding: .utf8) {
print(content)
}
}.resume()

成功上傳後,Airtable 的 Movie table 新增一筆再見街貓BOB的電影。

資料的修改和刪除

我們也可以修改和刪除資料,有興趣的朋友可進一步參考文件的說明。

串接 Airtable API 的參考範例

可參考以下串接 Reqres API 的說明和寫法。

作業練習

One more thing,關聯多個 table

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com