获取请求不会迅速执行,在请求中传递 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 中看不到这一点,因为它在幕后为您编码空间。
更好的方法是使用URLComponents
、URLQueryItem
并使用条件展开
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 中与会话请求一起传递扩展数据时出现问题
从 HttpURLConnection 获取 InputStream 对象时出现 FileNotFoundException