我正在尝试从网站下载一些 HTML,解析它, 并将其显示在网格中。 HTML 格式不是很好, 所以我已经写了一个解析它的 init() 方法 HTML 作为字符串。
我的 init() 在我的单元测试中运行良好。
我遇到的麻烦是,将 HTML 作为 通过 Alamofire 的字符串。我能找到的所有例子似乎 暗示我需要做一些接近于此的事情......
import SwiftUI
import Alamofire
func getHtml()-> String
{
let x = AF.request("https://httpbin.org/get")
.validate()
.response
if let y = x {
debugPrint(y)
return y.something()
}
return "<!-- the html could not be retrieved -->"
}
struct ContentView: View {
var body: some View {
Text(getHtml())
.padding()
}
}
我的挑战是 AF.request().response 似乎总是 是零。我觉得这很奇怪,因为所有的 Alamofire 例子 我在网上看到似乎甚至都没有检查过。它是 就好像旧的 Alamofire 返回了一个 HTTPResponse,而不是 HTTPResponse?
有没有一种简单的方法可以检索(非 JSON)输出 我正在查看的网站,然后将其交给我 构造函数?有或没有 Alamofire?
谢谢!
如果重要的话,这是 Alamofire 5.6.3
我尝试过的事情:
调用异步函数获取结果后不能返回
您需要
wait
获得结果,然后使用它们。有很多方法可以做到这一点,
包括completion handlers
。你将不得不查找如何使用
Swift 中的异步函数。
这里是一些代码,显示了 Alamofire 的另一个替代方案,使用 Swift async/await 框架, 从异步函数
html
.获取
getHtml()
字符串
请注意,您会从显示的网址中获取一些 JSON 数据,这些数据很容易被解码为 模型如果需要的话。
struct ContentView: View {
@State var htmlString = "no data"
var body: some View {
Text(htmlString)
.task {
await getHtml()
}
// Alamofire
// .onAppear {
// getHtml2() { html, error in
// if error == nil {
// print("\n---> html: \n \(html) \n")
// htmlString = html
// }
// }
// }
}
func getHtml() async {
if let url = URL(string: "https://httpbin.org/get") {
do {
let (data, _) = try await URLSession.shared.data(from: url)
let theString = String(data: data, encoding: .utf8)!
print("\n---> theString: \n \(theString) \n")
htmlString = theString
} catch {
print(error)
}
}
}
// using Alamofire, not tested
func getHtml2(completion: @escaping (String?, Error?) -> Void) {
AF.request("https://httpbin.org/get").response { response in
switch response.result {
case .success(_):
do {
let data = response.data!
let theString = String(data: data, encoding: .utf8)!
completion(theString, nil)
} catch {
print(error)
completion(nil, error)
}
case .failure(let AFError):
let error = AFError
print(error)
}
}
}
}