swift 正在寻找字符串形式的Alamofire响应,但响应始终为空[重复]

0md85ypi  于 2023-03-07  发布在  Swift
关注(0)|答案(1)|浏览(105)
    • 此问题在此处已有答案**:

(13个答案)
昨天关门了。
我试图从一个网站下载一些HTML,解析它,并在网格中显示它。HTML的格式不是很好,所以我已经编写了一个init()方法,将HTML解析为String。
init()在单元测试中运行良好。
我遇到的麻烦是,通过Alamofire把HTML作为一个字符串。我能找到的所有例子似乎都暗示我需要做一些接近这个的事情...

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
我尝试过的事情:

  • 我尝试过使用/不使用validate()
  • 在理论上,响应是不同步的,我尝试添加一个braindead while循环:while(响应!=空){休眠(1)}
iih3973s

iih3973s1#

在调用异步函数以获取结果之后,不能返回。
你需要wait来得到结果,然后使用它们。有很多方法可以做到这一点,包括completion handlers。你必须查找如何在Swift中使用异步函数。
下面的代码显示了Alamofire的另一种替代方法,使用Swift async/await框架从异步函数getHtml()获取html字符串。
请注意,您从显示的url中获得了一些JSON数据,如果需要,可以很容易地将其解码为模型。

struct ContentView: View {
    @State var htmlString = "no data"
    
    var body: some View {
        Text(htmlString)
        //        .task {
        //            await getHtml()
        //        }
        // Alamofire
            .onAppear {
                getHtml() { html, error in
                    if error == nil && html != 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)
                htmlString = String(data: data, encoding: .utf8)!
                print("\n---> htmlString: \n \(htmlString) \n")
            } catch {
                print(error)
            }
        }
    }
    
    // using Alamofire
    func getHtml(completion: @escaping  (String?, Error?) -> Void)  {
        AF.request("https://httpbin.org/get").response { response in
            switch response.result {
            case .success(_):
                let theString = String(data: response.data!, encoding: .utf8)!
                completion(theString, nil)
            case .failure(let AFError):
                let error = AFError
                print(error)
                completion(nil, error)
            }
        }
    }
    
}

相关问题