【问题标题】:Swift 4 using URLSession with non-secure URLSwift 4 使用带有非安全 URL 的 URLSession
【发布时间】:2018-09-16 12:05:44
【问题描述】:

我正在尝试将数据发送到使用 HTTP 而不是 HTTPS 的 WebAPI 服务,但是我收到以下错误:

“线程 1:致命错误:在展开可选值时意外发现 nil”

这是我的代码:

func logSample(emailSKU:String) -> String {
    //let myAPI = "https://itunes.apple.com/us/rss/topmovies/limit=25/json"
    let myAPI = "http://<myURlHere>/api/xxx"
    let url = URL(string: myAPI)
    let session = URLSession.shared.dataTask(with: (url)!) { (data, response, error) in   <====== Breaks on this line

    print("Response was:")
    print(response)
 }
    session.resume()
    return "return something here"
}

API 服务在其他应用程序中运行良好。 如果我使用上面的 iTunes url,那么一切正常,所以唯一的区别是 HTTP 和 HTTPS。

我在 plist 中添加了“允许任意负载”声明,有什么想法吗?

【问题讨论】:

  • 这不是因为 HTTP/HTTPS,这是因为您的 url 变量为零。
  • 请显示失败的完整网址。来自 Apple 文档:“[URL] 如果 URL 不能用字符串构成(例如,如果字符串包含 URL 中非法的字符,或者是空字符串),则返回 nil。”
  • 不幸的是,出于安全原因,我无法显示完整的 url,但这就是它返回的内容:此 XML 文件似乎没有任何与之关联的样式信息。文档树如下所示。 schemas.microsoft.com/2003/10/Serialization/">200</…>
  • 是'|'允许的 url 字符?

标签: swift xcode urlsession


【解决方案1】:

我检查了RFC 3986,它是“|”不允许使用且需要编码的字符。

【讨论】:

  • 啊,我明白了,我会去找那个API的开发者,看看能不能改
【解决方案2】:

补充@Joakims 回答:

给出的 URL 无效,因为使用了 |字符,需要编码。您可以通过以下方式执行此操作:

let urlString = "http://example.com/api/Scans?emailSKU=fred@example.com|123456"
if let encodedURLString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) {

    let url = URL(string: encodedURLString)
    print(url)
}

哪些输出:

可选(http://example.com/api/Scans?emailSKU=fred@example.com%7C123456)

所以|需要编码,用%7C代替

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    相关资源
    最近更新 更多