#186 適合新手練習串接網路 API 的 Random name — 回傳字串

最近研究了一下適合新手練習網路程式的 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
}

--

--

彼得潘的 iOS App Neverland
彼得潘的 100 道 Swift iOS App 謎題

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