Swift 语言的 HTTP 网络开发工具包:Alamofire

jopen 8年前

Alamofire 是一个功能强大的,Swift 语言 HTTP 网络开发工具包。支持各种 HTTP Method、JSON、文件上传、文件下载和多种认证方法。


GET 请求

Alamofire.request(.GET, "http://httpbin.org/get")


Alamofire.request(.GET,                    "http://httpbin.org/get",                    parameters: ["foo": "bar"])

包含 Response 处理

Alamofire.request(.GET,                    "http://httpbin.org/get",                    parameters: ["foo": "bar"])           .response { (request, response, data, error) in                       println(request)                       println(response)                       println(error)                     }

包含 Response 字符处理

Alamofire.request(.GET,                    "http://httpbin.org/get",                    parameters: ["foo": "bar"])           .responseString { (request, response, string, error) in                    println(string)           }


Alamofire.Method enum 列表出在RFC 2616中定义的HTTP方法 §9:

public enum Method: String {      case OPTIONS = "OPTIONS"      case GET = "GET"      case HEAD = "HEAD"      case POST = "POST"      case PUT = "PUT"      case PATCH = "PATCH"      case DELETE = "DELETE"      case TRACE = "TRACE"      case CONNECT = "CONNECT"  }

These values can be passed as the first argument of the Alamofire.request method:

Alamofire.request(.POST, "http://httpbin.org/post")    Alamofire.request(.PUT, "http://httpbin.org/put")    Alamofire.request(.DELETE, "http://httpbin.org/delete")

POST Request

let parameters = [      "foo": "bar",      "baz": ["a", 1],      "qux": [          "x": 1,          "y": 2,          "z": 3      ]  ]    Alamofire.request(.POST,                    "http://httpbin.org/post",                    parameters: parameters)

This sends the following HTTP Body:


Alamofire has built-in support for encoding parameters as URL query / URI form encoded, JSON, and Property List, using the Alamofire.ParameterEncoding enum:

Parameter Encoding

enum ParameterEncoding {      case URL      case JSON(options: NSJSONWritingOptions)      case PropertyList(format: NSPropertyListFormat,                        options: NSPropertyListWriteOptions)        func encode(request: NSURLRequest,                  parameters: [String: AnyObject]?) ->                      (NSURLRequest, NSError?)      { ... }  }

Manual Parameter Encoding of an NSURLRequest

let URL = NSURL(string: "http://httpbin.org/get")  var request = NSURLRequest(URL: URL)    let parameters = ["foo": "bar"]  let encoding = Alamofire.ParameterEncoding.URL  (request, _) = encoding.encode(request, parameters)

POST Request with JSON Response

Alamofire.request(.POST,                    "http://httpbin.org/post",                    parameters: parameters,                    encoding: .JSON(options: nil))           .responseJSON {(request, response, JSON, error) in              println(JSON)           }

Built-In Response Methods

  • response()
  • responseString(encoding: NSStringEncoding)
  • responseJSON(options: NSJSONReadingOptions)
  • responsePropertyList(options: NSPropertyListReadOptions)



  • File
  • Data
  • Stream
  • Multipart (Coming Soon)


let fileURL = NSBundle.mainBundle()                        .URLForResource("Default",                                        withExtension: "png")    Alamofire.upload(.POST,                   "http://httpbin.org/post",                   file: fileURL)

Uploading w/Progress

Alamofire.upload(.POST,                   "http://httpbin.org/post",                   file: fileURL)          .progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in              println(totalBytesWritten)          }          .responseJSON { (request, response, JSON, error) in              println(JSON)          }



  • Request
  • Resume Data


Alamofire.download(.GET,                    "http://httpbin.org/stream/100",                    destination: { (temporaryURL, response) in      if let directoryURL = NSFileManager.defaultManager()                            .URLsForDirectory(.DocumentDirectory,                                              inDomains: .UserDomainMask)[0]                            as? NSURL {          let pathComponent = response.suggestedFilename            return directoryURL.URLByAppendingPathComponent(pathComponent)      }        return temporaryURL  })

Using the Default Download Destination Closure Function

let destination =      Alamofire.Request.suggestedDownloadDestination(directory: .DocumentDirectory,                                                     domain: .UserDomainMask)    Alamofire.download(.GET,                     "http://httpbin.org/stream/100",                     destination: destination)    #### Downloading a File w/Progress    ```swift  Alamofire.download(.GET,                     "http://httpbin.org/stream/100",                     destination: destination)           .progress { (bytesRead, totalBytesRead, totalBytesExpectedToRead) in               println(totalBytesRead)           }           .response { (request, response, _, error) in               println(response)           }


支持Authentication Schemes

  • HTTP Basic
  • HTTP Digest
  • Kerberos
  • NTLM

HTTP Basic Authentication

let user = "user"  let password = "password"    Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)")      .authenticate(HTTPBasic: user, password: password)      .response {(request, response, _, error) in          println(response)      }

Authenticating with NSURLCredential & NSURLProtectionSpace

let user = "user"  let password = "password"    let credential = NSURLCredential(user: user,                                   password: password,                                   persistence: .ForSession)  let protectionSpace = NSURLProtectionSpace(host: "httpbin.org",                                             port: 0,                                             `protocol`: "https",                                             realm: nil, authenticationMethod: NSURLAuthenticationMethodHTTPBasic)    Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)")      .authenticate(usingCredential: credential, forProtectionSpace: protectionSpace)      .response {(request, response, _, error) in          println(response)  }


let request = Alamofire.request(.GET, "http://httpbin.org/ip")    println(request)  // GET http://httpbin.org/ip (200)


let request = Alamofire.request(.GET,                                  "http://httpbin.org/get",                                  parameters: ["foo": "bar"])    debugPrintln(request)

Output (cURL)

$ curl -i \      -H "User-Agent: Alamofire" \      -H "Accept-Encoding: Accept-Encoding: gzip;q=1.0,compress;q=0.5" \      -H "Accept-Language: en;q=1.0,fr;q=0.9,de;q=0.8,zh-Hans;q=0.7,zh-Hant;q=0.6,ja;q=0.5" \      "http://httpbin.org/get?foo=bar"


typealias AF = Alamofire 
AF.request(.GET, "http://httpbin.org/ip")