使用 Flickr API 时出现 Alamofire AFError

Posted

技术标签:

【中文标题】使用 Flickr API 时出现 Alamofire AFError【英文标题】:Alamofire AFError when work with Flickr API 【发布时间】:2016-11-20 15:53:00 【问题描述】:

我正在使用 Alamofire 从 flickr API 获取 JSON 数据。 这里的 if 函数,它从响应中准备一个 URL 数组:

func urlTolinkslist (tag: String) 
    print (viewSearchBar.text)
    let url = "https://api.flickr.com/services/feeds/photos_public.gne?tags=\(tag.replacingOccurrences(of: " ", with: "%20"))&format=json&nojsoncallback=1"
    Alamofire.request(url).validate().responseJSON  response in
        switch response.result 
        case .success(let value): 
            let json = JSON(value)
            let items = json["items"]
            self.linksList = []
            for i in 0..<items.count 
                let item = items[i]
                let media = item["media"]
                var link = String(describing: media["m"])
                self.linksList.append(link)
            
            print("count: \(self.linksList.count)")
            self.viewCollectionView.reloadData()
        case .failure(let error):
            print(error)
        
    

API URL 中的“tag”是我从搜索栏中获得的参数。在大多数情况下它工作正常,但在某些情况下我得到:

[Result]: FAILURE: responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid escape sequence around character 1029." UserInfo=NSDebugDescription=Invalid escape sequence around character 1029.))

我认为可能有一些额外的字符,但我不知道如何修复它。

【问题讨论】:

【参考方案1】:

让 Alamofire 为您编码参数:

func urlTolinkslist (tag: String) 
    let url = "https://api.flickr.com/services/feeds/photos_public.gne"
    var dict = [String:AnyObject]()
    dict["tags"] = tag
    dict["format"] = "json"
    dict["nojsoncallback"] = 1
    Alamofire.request(.GET, url, parameters: dict, encoding: .URLEncodedInURL, headers: nil).validate().responseJSON  response in
        switch response.result 
        case .success(let value):
            let json = JSON(value)
            let items = json["items"]
            self.linksList = []
            for i in 0..<items.count 
                let item = items[i]
                let media = item["media"]
                var link = String(describing: media["m"])
                self.linksList.append(link)
            
            print("count: \(self.linksList.count)")
            self.viewCollectionView.reloadData()
        case .failure(let error):
            print(error)
        
    

【讨论】:

不适合我。仍然得到一些标签的错误。 我错过了一些东西。错误是说响应不是 json。您可以尝试使用 .responseString 并打印结果吗?顺便说一句,继续使用上面相同的代码,因为你不应该自己编码参数 谢谢你,我链接了响应处理程序.responseString.responseJSON。所以我在失败的响应中发现了 \' 的组合,而成功的响应中不存在该组合。我想,我需要获取 responseString,清理响应,然后以某种方式将其转换为 JSON。会想办法…… 在响应中有 \' 听起来它是 javascript 特定的。也许有一种方法可以轻松获得干净的 JSON。

以上是关于使用 Flickr API 时出现 Alamofire AFError的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 调用 Flickr API

为啥调用 API 时出现 CORS 错误

我在用这个 flickr api 查询做啥?

使用参数获取方法时出现野狗错误

使用 facebook api 时出现错误

尝试使用 twilio Api phpSDK 发送消息时出现致命错误