swift - 如何进行正确的 API 调用?
问题描述
我正在尝试通过调用 API 来访问 fixer.io。这是我第一次尝试这样做,但我没有得到想要的结果。我想从此 JSON 文件中获取“速率”和“结果”。
{
"success": true,
"query": {
"from": "GBP",
"to": "JPY",
"amount": 25
},
"info": {
"timestamp": 1519328414,
"rate": 148.972231
},
"historical": ""
"date": "2018-02-22"
"result": 3724.305775
}
我实现的方法就是这个,但是在调用这个 API 时我不知道如何检索“rate”和“result”。
extension APIsRuler {
func getExchangeRate(from: String, to: String, amount: String, callback: @escaping (Bool, ConversionResult?) -> Void) {
var request = URLRequest(url: APIsRuler.exchangeURL)
let body = "convert?access_key=\(APIsRuler.exchangeAPI)&from=\(from)&to=\(to)&amount=\(amount)"
request.httpMethod = "GET"
request.httpBody = body.data(using: .utf8)
let session = URLSession(configuration: .default)
task?.cancel()
task = session.dataTask(with: request) { (data, response, error) in
DispatchQueue.main.async {
guard let data = data, error == nil else {
return callback(false, nil)
}
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
return callback(false, nil)
}
guard let responseJSON = try? JSONDecoder().decode([String: Double].self, from: data),
let rate = responseJSON["rate"],
let result = responseJSON["result"] else {
return callback(false, nil)
}
let conversionResult = ConversionResult(exchangeRate: rate, exchangeResult: result)
callback(true, conversionResult)
}
}
task?.resume()
}
}
解决方案
使用真实的模型对象,如下所示:
struct Conversion: Codable {
let success: Bool
let query: Query
let info: Info
let historical, date: String
let result: Double
}
struct Info: Codable {
let timestamp: Int
let rate: Double
}
struct Query: Codable {
let from, to: String
let amount: Int
}
并使用以下方法解析您的响应JSONDecoder
:
do {
let conversion = try JSONDecoder().decode(Conversion.self, from: data)
let rate = conversion.info.rate
let result = conversion.result
} catch { print(error) }
推荐阅读
- php - Lumen / Docker / MySQL (SQLSTATE[HY000] [2002] Connection denied) 但我可以外部连接
- javascript - 将嵌套数组值映射到 Map,并具有按数组索引设置 Map 值的功能,该索引将通过引用反映在嵌套数组中
- docker - 如何使用 exec、rw 标志挂载 docker tmpfs?
- python - 拆分 CSV 时打开的输出文件过多
- javascript - 用 SQL 数据填充 Javascript 图表(折线图)
- django - Django Azure 将文件上传到 Blob 存储
- regex - Python Regex - 如何提取第三部分?
- typescript - Ngrx 商店 - 如何选择根状态
- android - 为什么房间删除操作(使用 RxJava)即使指定不同的订阅线程也会出现 UI 线程错误?
- java - 我来自 launch4j 的 .exe 文件不像我的 java 文件那样工作。我错过了什么吗?