获取请求不会迅速执行,在请求中传递 URL 时出现 nil 值错误

Posted

技术标签:

【中文标题】获取请求不会迅速执行,在请求中传递 URL 时出现 nil 值错误【英文标题】:Get request doesn't get executed in swift, getting nil value error where URL is passed in the request 【发布时间】:2021-08-24 08:31:33 【问题描述】:

我正在尝试在我的应用程序中添加一个 GET 请求。 值或最终 url 字符串在我的 sURL 变量中正确流动。但仍然在执行此代码时,我在行 - “var request = URLRequest(url: URL(string: sUrl)!)”处得到“Found nil error”

请帮忙。

我的代码 -

class AllStickerService 
    static let allStickerInstance: AllStickerService = AllStickerService()
    var delegateAllSticker: AllStickerProtocol!
    
    func fetchAllSticker(category: String, APITokenString: String) 
        var sUrl = "http://xyzabc.com/api/stickers"
        let params = ["category": category]
        
        var sParams = ""
           for (key,value) in params 
              sParams += key + "=" + value
            print("\(key), \(value)")
           
        if !sParams.isEmpty 
            sParams = "?" + sParams
            sUrl = sUrl + sParams
        

        var request = URLRequest(url: URL(string: sUrl)!)
        print(request)
        request.httpMethod = "GET"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.addValue("Bearer "+APITokenString, forHTTPHeaderField: "Authorization")
        
        let session = URLSession.shared
        session.dataTask(with: request)  (data, response, error) in
            
            if (response as? HTTPURLResponse) != nil 
                
                if let httpResponse = response as? HTTPURLResponse 
                    print("statusCode: \(httpResponse.statusCode)")
                    print(httpResponse)
                
                
                if let data = data
                    do 
                        guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else  return 
                        print(json)
                    catch 
                        print("Error\(error)")
                    
                
            
        .resume()
    

【问题讨论】:

不要强制解包,也不要使用字符串连接,使用URLComponents 创建您的 URL。字符串连接不会对参数中的空间进行百分比编码。 启用应用传输? GET 请求也不需要内容类型标头。 @ElTomato 它已经设置为“是” 【参考方案1】:

强制展开很少是一个好主意。要么使用字符串连接来创建 URL;要么除了潜在的安全问题外,您还必须担心 url 编码之类的问题,这就是您的问题。

您的category 参数值有一个空格,需要将其编码为 %20,但您不这样做会导致 URL 字符串无效。您在 Postman 中看不到这一点,因为它在幕后为您编码空间。

更好的方法是使用URLComponentsURLQueryItem 并使用条件展开

func fetchAllSticker(category: String, APITokenString: String) 
     var sUrl = "http://xyzabc.com/api/stickers"
     let params = URLQueryItem(name:"category", value: category)

     if var urlComponents = URLComponents(string:"http://xyzabc.com/api/stickers") 
         
         urlComponents.queryItems = params
         
         if let url = urlComponents.url 
             var request = URLRequest(url: url) 
             ...
         
    

我还建议您考虑使用 Decodable 来处理您的 JSON 响应,而不是 JSONSerialization

【讨论】:

@Pawlw11 感谢您的意见。你的回答奏效了。

以上是关于获取请求不会迅速执行,在请求中传递 URL 时出现 nil 值错误的主要内容,如果未能解决你的问题,请参考以下文章

在 QuickBlox 中与会话请求一起传递扩展数据时出现问题

从 AWS Lambda 获取 URL 时出现静默错误

发出发布请求时出现NodeJS CORS错误

从 HttpURLConnection 获取 InputStream 对象时出现 FileNotFoundException

在 reactjs 中使用表单并获取请求时出现问题

发出 Axios GET 请求时出现无限循环 - 循环不会关闭