使用 Swift 3 和 Alamofire 4 后没有得到响应

Posted

技术标签:

【中文标题】使用 Swift 3 和 Alamofire 4 后没有得到响应【英文标题】:Not getting response after using Swift 3 and Alamofire 4 【发布时间】:2016-11-17 08:14:09 【问题描述】:

我在将代码更改为 swift 3 并使用 Alamofire 4 后遇到问题。 在使用 Alamofire 4 和 swift 3 之前,我的代码运行良好。当我更改为 swift 3 并使用 Alamofire 4 时,我遇到了很多错误,并且在将它们全部修复之后。 我还有一个问题是我没有得到任何回应!

我目前使用 Swift 3 和 Alamofire 4 的代码

import UIKit
import Alamofire

protocol VideoModelDelegate
    func dataReady()



class VideoModel: NSObject 

    let API_KEY = "xxxxxxxxxxxxxxxxx"
    let UPLOADS_PLAYLIST_ID = "PLc4t1-K0nthvSUhYtc43BiG-Z9LK2mw5D"


    var videoArray = [Video]()

    var delegate: VideoModelDelegate?

    let urladdress = "https://www.googleapis.com/youtube/v3/playlistItems"


    func getFeedVideos() 

        Alamofire.request("https://www.googleapis.com/youtube/v3/playlistItems", method: .get, parameters: ["part":"snippet", "playlistId": UPLOADS_PLAYLIST_ID,"key": API_KEY, "maxResults": "50"], encoding: JSONEncoding.default).responseJSON(completionHandler:  (response) -> Void in

            print("##############################")
            print(response)
            print("##############################")



            if let JSON = response.result.value as? [String: Any] 

                print(JSON)

                var arrayOfVideos = [Video]()

                if let items = JSON["items"] as? [[String : Any]] 

                    for video in items 
                        print(JSON)

                        let videoObj = Video()
                        videoObj.videoId = (video as NSDictionary).value(forKeyPath:"snippet.resourceId.videoId") as! String

                        videoObj.videoTitle = (video as NSDictionary).value(forKeyPath:"snippet.title") as! String

                        videoObj.videoDescription = video["snippet.description"] as! String

                        if video[ "snippet.thumbnails.maxres.url"] != nil 
                            videoObj.videoThumbnailUrl = video["snippet.thumbnails.maxres.url"] as! String
                        
                        else if video["snippet.thumbnails.hqdefault.url"] != nil
                            videoObj.videoThumbnailUrl = video["snippet.thumbnails.hqdefault.url"] as! String

                        
                        else if video["snippet.thumbnails.sddefault.url"] != nil
                            videoObj.videoThumbnailUrl = video["snippet.thumbnails.sddefault.url"] as! String

                        
                        else if video["snippet.thumbnails.mqdefault.url"] != nil
                            videoObj.videoThumbnailUrl = video["snippet.thumbnails.mqdefault.url"] as! String

                        

                        else if video["snippet.thumbnails.default.url"] != nil
                            videoObj.videoThumbnailUrl = video["snippet.thumbnails.default.url"] as! String

                        
                        else

                        



                        arrayOfVideos.append(videoObj)


                        if self.delegate != nil 
                            self.delegate!.dataReady()
                        
                    
                
                else
                    print("NOO")
                
            

        )
    

我之前运行良好的代码:

import UIKit
import Alamofire

protocol VideoModelDelegate
    func dataReady()



class VideoModel: NSObject 

    let API_KEY = "xxxx"
    let UPLOADS_PLAYLIST_ID = Video().playlistID

    var videoArray = [Video]()

    var delegate:VideoModelDelegate?


    func getFeedVideos()

        // Fetch the videos dynamically using YouTube Data API
        Alamofire.request(.GET, "https://www.googleapis.com/youtube/v3/playlistItems", parameters: ["part":"snippet", "playlistId":UPLOADS_PLAYLIST_ID, "key":API_KEY, "maxResults":50], encoding: ParameterEncoding.URL, headers: nil).responseJSON  (response) in

            if let JSON = response.result.value 

                var arrayOfVideos = [Video]()
                for video in JSON["items"] as! NSArray
                    //print(video)

                    // Create video objects off of the JSON response
                    let videoObj = Video()
                    videoObj.videoId = video.valueForKeyPath("snippet.resourceId.videoId") as! String
                    videoObj.videoTitle = video.valueForKeyPath("snippet.title") as! String
                    videoObj.videoDescription = video.valueForKeyPath("snippet.description") as! String


                    if video.valueForKeyPath("snippet.thumbnails.maxres.url") != nil 
                        videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.maxres.url") as! String
                    
                    else if video.valueForKeyPath("snippet.thumbnails.hqdefault.url") != nil
                        videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.hqdefault.url") as! String

                    
                    else if video.valueForKeyPath("snippet.thumbnails.sddefault.url") != nil
                        videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.sddefault.url") as! String

                    
                    else if video.valueForKeyPath("snippet.thumbnails.mqdefault.url") != nil
                        videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.mqdefault.url") as! String

                    
                    else
                        videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.default.url") as! String
                    

                    arrayOfVideos.append(videoObj)

                

                // when all the video objects have been constructed, assign the array to the VideoModel property
                self.videoArray = arrayOfVideos.reverse()

                // Notify the delegate the data is ready
                if self.delegate != nil
                    self.delegate!.dataReady()
                
            
        

    


当我尝试打印我在日志中得到的响应时:

FAILURE: Error Domain=kCFErrorDomainCFNetwork Code=303 "(null)" UserInfo=NSErrorPeerAddressKey=length = 28, capacity = 28, bytes = 0x1c1e01bb000000002607f8b040090809 ... 0000200a00000000, _kCFStreamErrorCodeErrorKey=-2201, _kCFStreamErrorKey=-2201, _k /p>

【问题讨论】:

有没有log的信息? 请注意,您之前使用的是parameter encoding,现在您使用的是encoding: JSONEncoding.default您检查了吗? @user3707644 ,谢谢您的提问。我有同样的问题。 【参考方案1】:

您已尝试使用编码:JSONEncoding.default。

编码方式应该是 URLEncoding.default

【讨论】:

Alamofire 4 中有一个名为 ParameterEncoding.URL 的注释 请尝试使用 URLEncoding.default 而不是 JSONEncoding.default

以上是关于使用 Swift 3 和 Alamofire 4 后没有得到响应的主要内容,如果未能解决你的问题,请参考以下文章

带参数的 Alamofire 4 Swift 3 GET 请求

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析

如何在 Swift 3 中使用 Alamofire 4 解析这个 json?

使用 Alamofire 4 (Swift 3) 下载文件的路径

Swift 3.0 Alamofire 4.0 - Domain=NSURLErrorDomain Code=-999 “取消”

响应和响应序列化程序 Swift 3.0 的 Alamofire 3->4 问题