期末作業-Step2
Published in
7 min readJun 12, 2023
介接Airtable商品價目表
接續上次完成的Prototype設計, 將整個APP改為透過API跟Airtable索取飲料價目表, 並上傳訂單資訊, 這部分將分成兩個階段來做, 本次將以抓取價目表為主。
Airtable價目表範例
Airtable表格製作範例請參考peter文章
設定並取得API
詳細操作步驟一樣參考下方連結
接下來的部分就比較繁複, 先透過postman驗證api抓資料沒問題, 再用Json分析工具解析格式, 建立好物件Codable型別, 再用playground先跑一輪, 確定都正常後才上APP進行抓取
Postman測試API
JSON Editor Online分析JSON格式
playground設計Codable型別與測試下載資料
完成後就可以上版套用
物件型別設定
struct DrinkResource: Codable {
let records: [Record]
}
struct Record: Codable {
let fields: Field
}
struct Field: Codable {
let name: String?
let dollar: Int?
let description: String?
let image: [Image]?
}
struct Image: Codable {
let url : URL
}
設定下載函式
var drinks = [Record]()
let api = "patWEGAksQXFHL4"
func fetchDrink() {
if let url = URL(string: "https://api.airtable.com/v0/appFhXTZoOT4a7WPJ/Drink") {
var request = URLRequest(url: url)
request.setValue("Bearer \(api)", forHTTPHeaderField: "Authorization")
URLSession.shared.dataTask(with: request) { data, response, error in
if let data,
let response = response as? HTTPURLResponse,
response.statusCode == 200,
error == nil {
// 驗證資料抓取
// let content = String(data: data, encoding: .utf8)
// print(content)
let decoder = JSONDecoder()
do {
let drinkResource = try decoder.decode(DrinkResource.self, from: data)
self.drinks = drinkResource.records
print(self.drinks.count)
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch {
print(error)
}
} else {
print(error ?? "download error")
}
}.resume()
}
}
在ViewDidLoad()中套用
override func viewDidLoad() {
super.viewDidLoad()
fetchDrink()
}
設定DataSource
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return drinks.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "\(MenuTableViewCell.self)", for: indexPath) as! MenuTableViewCell
// Configure the cell...
let drink = drinks[indexPath.row].fields
cell.nameLabel.text = drink.name
cell.descriptionLabel.text = drink.description
cell.dollarLabel.text = "$\(drink.dollar?.description ?? "30")"
if let url = drink.image?[0].url {
cell.photoImageView.kf.setImage(with: url)
}
return cell
}
注意圖片是透過第三方套件抓取,所以要匯入套件,請參考peter下方文件
成功後的狀態
接下來我們要處理上傳訂單資訊,連結如下