#186 適合新手練習串接網路 API 的 Random name — 回傳字串
Published in
7 min readNov 22, 2022
最近研究了一下適合新手練習網路程式的 API。由於網路程式有點複雜,像是抓取 JSON & 圖片還要學習如何解析資料,因此想找尋是否有簡單回傳字串的 API,讓新手練習抓到字串後顯示在畫面上。
結果真的找到了這樣的 API,Random name API !
ps: 很可惜的,Random name API 目前不能連了,以下文章只能當參考
Random name API 可取得各種有趣的名字,像是男孩名,女孩名,國家名,城市名,電影名,遊戲名等。API 回傳的格式預設是 JSON,不過我們可在網址的參數傳入 format=text
,讓 API 回傳的格式變成字串。
比方以下網址將得到一個隨機的可愛男孩名字。
https://names.drycodes.com/1?format=text&nameOptions=boy_names&separator=space
結果
Cory Hubert
程式範例
以下分別示範 SwiftUI & UIKit 的寫法。
SwiftUI
- 使用 async / await
import SwiftUI
struct ContentView: View {
@State private var name = "?"
var body: some View {
VStack {
Text(name)
Button {
Task {
do {
name = try await fetchName()
} catch {
print(error)
}
}
} label: {
Text("幫寶寶取個名字")
}
}
}
func fetchName() async throws -> String {
let url = URL(string: "https://names.drycodes.com/1?format=text&nameOptions=boy_names&separator=space")!
let (data, _) = try await URLSession.shared.data(from: url)
if let name = String(data: data, encoding: .utf8) {
return name
} else {
throw ApiError.invalidData
}
}
}
enum ApiError: Error {
case invalidData
}
- 使用 completion handler
import SwiftUI
struct ContentView: View {
@State private var name = "?"
var body: some View {
VStack {
Text(name)
Button {
fetchName()
} label: {
Text("幫寶寶取個名字")
}
}
}
func fetchName() {
let url = URL(string: "https://names.drycodes.com/1?format=text&nameOptions=boy_names&separator=space")!
URLSession.shared.dataTask(with: url) { data, response, error in
if let data,
let name = String(data: data, encoding: .utf8) {
self.name = name
}
}.resume()
}
}
UIKit
- 使用 async / await
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var nameLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func fetchNameButtonTap(_ sender: Any) {
Task {
do {
nameLabel.text = try await fetchName()
} catch {
print(error)
}
}
}
func fetchName() async throws -> String {
let url = URL(string: "https://names.drycodes.com/1?format=text&nameOptions=boy_names&separator=space")!
let (data, _) = try await URLSession.shared.data(from: url)
if let name = String(data: data, encoding: .utf8) {
return name
} else {
throw ApiError.invalidData
}
}
}
enum ApiError: Error {
case invalidData
}
- 使用 completion handler
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var nameLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func fetchNameButtonTap(_ sender: Any) {
fetchName()
}
func fetchName() {
let url = URL(string: "https://names.drycodes.com/1?format=text&nameOptions=boy_names&separator=space")!
URLSession.shared.dataTask(with: url) { data, response, error in
if let data,
let name = String(data: data, encoding: .utf8) {
DispatchQueue.main.async {
self.nameLabel.text = name
}
}
}.resume()
}
}
enum ApiError: Error {
case invalidData
}