使用 Alamofire 从 API 获取数据时出错

Posted

技术标签:

【中文标题】使用 Alamofire 从 API 获取数据时出错【英文标题】:Error when grabbing data from API using Alamofire 【发布时间】:2018-05-03 06:58:48 【问题描述】:

在尝试使用 Alamofire 从 Internet 访问 API 时,任何人都知道如何处理此错误。奇怪的是我对其他 API 使用了相同的函数,它们似乎工作得很好,但不是这个。

API 是:

http://minecraftpocket-servers.com/api/?object=servers&element=voters&key=833gowl7nz7jyqaqx96dagqzamn431yr9h&month=current&format=json&limit=10

这是错误:

可选(错误域=NSURLErrorDomain Code=-1022 "资源可以 未加载,因为应用程序传输安全策略需要 使用安全连接。” UserInfo=NSUnderlyingError=0x6000004496c0 错误 域=kCFErrorDomainCFNetwork 代码=-1022 "(null)", NSErrorFailingURLStringKey=http://minecraftpocket-servers.com/api/?object=servers&element=voters&key=833gowl7nz7jyqaqx96dagqzamn431yr9h&month=current&format=json&limit=10, NSErrorFailingURLKey=http://minecraftpocket-servers.com/api/?object=servers&element=voters&key=833gowl7nz7jyqaqx96dagqzamn431yr9h&month=current&format=json&limit=10, NSLocalizedDescription=资源无法加载,因为 应用传输安全策略需要使用安全的 连接。)

这是我要调用的函数。

func getAPIData(url: String) 
        Alamofire.request(url, method: .get)
            .responseJSON  response in
                if response.result.isSuccess 

                    let dataJSON : JSON = JSON(response.result.value!)

                    self.updateLabels(json: dataJSON)
                    print("Success!")

                 else 
                    print("Error: Could not get data.")
                    print("Error: ", response.error)
                
        
    

【问题讨论】:

【参考方案1】:

这是因为您使用的不是安全站点 (https),​​而是 http。

将此添加到您的 info.plist

 <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>example.com</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>

【讨论】:

【参考方案2】:

正如它所说,应用传输安全策略需要安全连接。

您可以在您的 plist 中启用任意加载

将条目Add App Transport Security Settings 添加为字典并添加一个布尔条目Allow Arbitrary Loads,设置为true。

但是,如果您可以控制服务器端,我建议您使用 SSL。使用 HTTPS 不会触发此错误。

【讨论】:

以上是关于使用 Alamofire 从 API 获取数据时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 Alamofire 从 API 获取响应

使用 alamofire 和 swiftyJson 从 UICollectionViewCell 内的 UICollectionView 的 api 中获取数据

UIView 在使用 SwiftyJSON 和 Alamofire 从 API 返回的数据之前被渲染

使用 Alamofire 从 api 获得响应时的问题

Alamofire - 如何从 AFError 获取 API 错误

具有核心数据的 Alamofire 对象映射器