swift 网络请求 2

来源:互联网 发布:用java编写爱心 编辑:程序博客网 时间:2024/04/30 07:20

http://www.cocoachina.com/ios/20141202/10390.html

(1) Alamofire 其实是基于NSURLSession的,但是它可以免去您写样板(boilerplate)代码的麻烦,并且可以让网络模块的代码更为简单易用。您可以通过一些非常简单的操作来访问 Internet 上的数据,并且写出来的代码也会更加清晰明了、简单易读。

要使用 Alamofire 的话,首先需要导入它。请打开PhotoBrowserCollectionViewController.swift文件,然后在文件顶部添加如下代码:
import Alamofire
您需要在每个使用了 Alamofire 类以及函数的文件中添加这条import语句。

接下来,在setupView()下方的viewDidLoad()方法中添加如下代码:
Alamofire.request(.GET, “https://api.500px.com/v1/photos“).responseJSON() {
(, , data, _) in
println(data)
}
过会儿我会对其做出详细解释,但是首先您需要生成并运行该应用,这个时候您会在控制台中看到如下信息:
Optional({
error = “Consumer key missing.”;
status = 401;
})

下面来解释一下那些代码到底做了些什么:

· Alamofire.request(:)接收两个参数:method和URLString。其中,method 通常是.GET、.POST;URLString通常是您想要访问的内容的 URL。其将返回一个Alamofire.Request对象。

· 通常情况下,您只需将请求对象链接到响应方法上。例如,在上面的代码中,请求对象简单地调用了responseJSON()方法。当网络请求完毕后,responseJSON()方法会调用我们所提供的闭包。在我们的示例中,我们只是简单的将经过解析的 JSON 输出到控制台中。

· 调用responseJSON方法意味着您期望获得一个 JSON 数据。在我们的示例中,Alamofire 试图解析响应数据并返回一个 JSON 对象。或者,您可以使用responsePropertyList来请求获得一个属性列表,也可以使用responseString来请求获得一个初始字符串。在本教程后面,您将了解更多关于响应序列化方法的使用方式。

您可以从控制台中看到输出的响应数据,服务器报告您需要一个名为consumer key的东西。在我们继续使用 Alamofire 之前,我们需要从 500px 网站的 API 中获取一个密钥。

获取消费者密钥

前往https://500px.com/signup,然后使用您的邮箱免费注册,或者使用您的 Facebook 、Twitter 或者 Google 帐号登录。

一旦您完成了注册流程,那么前往https://500px.com/settings/applications并单击”Register your application”。

Alamofire.request(.GET, "https://api.500px.com/v1/photos", parameters: ["consumer_key": "PASTE_YOUR_CONSUMER_KEY_HERE"]).responseJSON() {  (_, _, JSON, _) in  println(JSON)}
{  "feature": "popular",  "filters": {      "category": false,      "exclude": false  },  "current_page": 1,  "total_pages": 250,  "total_items": 5000,  "photos": [    {      "id": 4910421,      "name": "Orange or lemon",      "description": "",...      }    },    {      "id": 4905955,      "name": "R E S I G N E D",      "description": "From the past of Tagus River, we have History and memories, some of them abandoned and disclaimed in their margins ...",...    }  ]}
let photoInfos = (JSON!.valueForKey("photos") as [NSDictionary]).filter({    ($0["nsfw"] as Bool) == false  }).map {    PhotoInfo(id: $0["id"] as Int, url: $0["image_url"] as String)  }self.photos.addObjectsFromArray(photoInfos)self.collectionView.reloadData()
let imageURL = (photos.objectAtIndex(indexPath.row) as PhotoInfo).urlAlamofire.request(.GET, imageURL).response() {  (_, _, data, _) in  let image = UIImage(data: data! as NSData)  cell.imageView.image = image}
enum Router: URLRequestConvertible {  static let baseURLString = "https://api.500px.com/v1"  static let consumerKey = "PASTE_YOUR_CONSUMER_KEY_HERE"    case PopularPhotos(Int)    case PhotoInfo(Int, ImageSize)    case Comments(Int, Int)    var URLRequest: NSURLRequest {      let (path: String, parameters: [String: AnyObject]) = {        switch self {        case .PopularPhotos (let page):          let params = ["consumer_key": Router.consumerKey, "page": "\(page)", "feature": "popular", "rpp": "50",  "include_store": "store_download", "include_states": "votes"]          return ("/photos", params)        case .PhotoInfo(let photoID, let imageSize):          var params = ["consumer_key": Router.consumerKey, "image_size": "\(imageSize.rawValue)"]          return ("/photos/\(photoID)", params)        case .Comments(let photoID, let commentsPage):          var params = ["consumer_key": Router.consumerKey, "comments": "1", "comments_page": "\(commentsPage)"]          return ("/photos/\(photoID)/comments", params)        }        }()        let URL = NSURL(string: Router.baseURLString)        let URLRequest = NSURLRequest(URL: URL!.URLByAppendingPathComponent(path))        let encoding = Alamofire.ParameterEncoding.URL        return encoding.encode(URLRequest, parameters: parameters).0  }}
0 0
原创粉丝点击