|
|
@@ -134,9 +134,9 @@ Alamofire.request(.GET, "http://httpbin.org/get")
|
|
|
```swift
|
|
|
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
|
|
|
.response { request, response, data, error in
|
|
|
- println(request)
|
|
|
- println(response)
|
|
|
- println(error)
|
|
|
+ print(request)
|
|
|
+ print(response)
|
|
|
+ print(error)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -157,8 +157,9 @@ Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
|
|
|
|
|
|
```swift
|
|
|
Alamofire.request(.GET, "http://httpbin.org/get")
|
|
|
- .responseString { _, _, string, _ in
|
|
|
- println(string)
|
|
|
+ .responseString { _, _, result in
|
|
|
+ print("Success: \(result.isSuccess)")
|
|
|
+ print("Response String: \(result.value)")
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -166,8 +167,9 @@ Alamofire.request(.GET, "http://httpbin.org/get")
|
|
|
|
|
|
```swift
|
|
|
Alamofire.request(.GET, "http://httpbin.org/get")
|
|
|
- .responseJSON { _, _, JSON, _ in
|
|
|
- println(JSON)
|
|
|
+ .responseJSON { _, _, result in
|
|
|
+ print(result)
|
|
|
+ debugPrint(result)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -177,11 +179,11 @@ Response handlers can even be chained:
|
|
|
|
|
|
```swift
|
|
|
Alamofire.request(.GET, "http://httpbin.org/get")
|
|
|
- .responseString { _, _, string, _ in
|
|
|
- println(string)
|
|
|
+ .responseString { _, _, result in
|
|
|
+ print("Response String: \(result.value)")
|
|
|
}
|
|
|
- .responseJSON { _, _, JSON, _ in
|
|
|
- println(JSON)
|
|
|
+ .responseJSON { _, _, result in
|
|
|
+ print("Response JSON: \(result.value)")
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -191,15 +193,7 @@ Alamofire.request(.GET, "http://httpbin.org/get")
|
|
|
|
|
|
```swift
|
|
|
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"
|
|
|
+ case OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -298,8 +292,8 @@ let headers = [
|
|
|
]
|
|
|
|
|
|
Alamofire.request(.GET, "http://httpbin.org/get", headers: headers)
|
|
|
- .responseJSON { _, _, JSON, _ in
|
|
|
- println(JSON)
|
|
|
+ .responseJSON { _, _, result in
|
|
|
+ debugPrint(result)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -328,10 +322,10 @@ Alamofire.upload(.POST, "http://httpbin.org/post", file: fileURL)
|
|
|
```swift
|
|
|
Alamofire.upload(.POST, "http://httpbin.org/post", file: fileURL)
|
|
|
.progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in
|
|
|
- println(totalBytesWritten)
|
|
|
+ print(totalBytesWritten)
|
|
|
}
|
|
|
- .responseJSON { request, response, JSON, error in
|
|
|
- println(JSON)
|
|
|
+ .responseJSON { request, response, result in
|
|
|
+ debugPrint(result)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -348,11 +342,11 @@ Alamofire.upload(
|
|
|
encodingCompletion: { encodingResult in
|
|
|
switch encodingResult {
|
|
|
case .Success(let upload, _, _):
|
|
|
- upload.responseJSON { request, response, JSON, error in
|
|
|
- println(JSON)
|
|
|
+ upload.responseJSON { request, response, result in
|
|
|
+ debugPrint(result)
|
|
|
}
|
|
|
case .Failure(let encodingError):
|
|
|
- println(encodingError)
|
|
|
+ print(encodingError)
|
|
|
}
|
|
|
}
|
|
|
)
|
|
|
@@ -391,10 +385,10 @@ Alamofire.download(.GET, "http://httpbin.org/stream/100", destination: destinati
|
|
|
```swift
|
|
|
Alamofire.download(.GET, "http://httpbin.org/stream/100", destination: destination)
|
|
|
.progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in
|
|
|
- println(totalBytesRead)
|
|
|
+ print(totalBytesRead)
|
|
|
}
|
|
|
.response { request, response, _, error in
|
|
|
- println(response)
|
|
|
+ print(response)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -420,7 +414,7 @@ let password = "password"
|
|
|
Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)")
|
|
|
.authenticate(user: user, password: password)
|
|
|
.response { request, response, _, error in
|
|
|
- println(response)
|
|
|
+ print(response)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -436,8 +430,8 @@ let base64Credentials = credentialData.base64EncodedStringWithOptions(nil)
|
|
|
let headers = ["Authorization": "Basic \(base64Credentials)"]
|
|
|
|
|
|
Alamofire.request(.GET, "http://httpbin.org/basic-auth/user/password", headers: headers)
|
|
|
- .responseJSON { _, _, JSON, _ in
|
|
|
- println(JSON)
|
|
|
+ .responseJSON { _, _, result in
|
|
|
+ print(result)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -452,7 +446,7 @@ let credential = NSURLCredential(user: user, password: password, persistence: .F
|
|
|
Alamofire.request(.GET, "https://httpbin.org/basic-auth/\(user)/\(password)")
|
|
|
.authenticate(usingCredential: credential)
|
|
|
.response { request, response, _, error in
|
|
|
- println(response)
|
|
|
+ print(response)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -467,7 +461,7 @@ Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
|
|
|
.validate(statusCode: 200..<300)
|
|
|
.validate(contentType: ["application/json"])
|
|
|
.response { _, _, _, error in
|
|
|
- println(error)
|
|
|
+ print(error)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -478,8 +472,13 @@ Automatically validates status code within `200...299` range, and that the `Cont
|
|
|
```swift
|
|
|
Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
|
|
|
.validate()
|
|
|
- .response { _, _, _, error in
|
|
|
- println(error)
|
|
|
+ .responseJSON { _, _, result in
|
|
|
+ switch result {
|
|
|
+ case .Success:
|
|
|
+ print("Validation Successful")
|
|
|
+ case .Failure(_, let error):
|
|
|
+ print(error)
|
|
|
+ }
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -488,7 +487,7 @@ Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
|
|
|
```swift
|
|
|
let request = Alamofire.request(.GET, "http://httpbin.org/ip")
|
|
|
|
|
|
-println(request)
|
|
|
+print(request)
|
|
|
// GET http://httpbin.org/ip (200)
|
|
|
```
|
|
|
|
|
|
@@ -497,7 +496,7 @@ println(request)
|
|
|
```swift
|
|
|
let request = Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"])
|
|
|
|
|
|
-debugPrintln(request)
|
|
|
+debugPrint(request)
|
|
|
```
|
|
|
|
|
|
#### Output (cURL)
|
|
|
@@ -600,18 +599,23 @@ For example, here's how a response handler using [Ono](https://github.com/mattt/
|
|
|
extension Request {
|
|
|
public static func XMLResponseSerializer() -> GenericResponseSerializer<ONOXMLDocument> {
|
|
|
return GenericResponseSerializer { request, response, data in
|
|
|
- if data == nil {
|
|
|
- return (nil, nil)
|
|
|
+ guard let validData = data else {
|
|
|
+ let failureReason = "Data could not be serialized. Input data was nil."
|
|
|
+ let error = Error.errorWithCode(.DataSerializationFailed, failureReason: failureReason)
|
|
|
+ return .Failure(data, error)
|
|
|
}
|
|
|
|
|
|
var XMLSerializationError: NSError?
|
|
|
- let XML = ONOXMLDocument(data: data!, error: &XMLSerializationError)
|
|
|
|
|
|
- return (XML, XMLSerializationError)
|
|
|
+ if let XML = ONOXMLDocument(data: validData, error: &XMLSerializationError) {
|
|
|
+ return .Success(XML)
|
|
|
+ } else {
|
|
|
+ return .Failure(data, XMLSerializationError!)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public func responseXMLDocument(completionHandler: (NSURLRequest, NSHTTPURLResponse?, ONOXMLDocument?, NSError?) -> Void) -> Self {
|
|
|
+ public func responseXMLDocument(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<ONOXMLDocument>) -> Void) -> Self {
|
|
|
return response(responseSerializer: Request.XMLResponseSerializer(), completionHandler: completionHandler)
|
|
|
}
|
|
|
}
|
|
|
@@ -622,20 +626,30 @@ extension Request {
|
|
|
Generics can be used to provide automatic, type-safe response object serialization.
|
|
|
|
|
|
```swift
|
|
|
-@objc public protocol ResponseObjectSerializable {
|
|
|
+public protocol ResponseObjectSerializable {
|
|
|
init?(response: NSHTTPURLResponse, representation: AnyObject)
|
|
|
}
|
|
|
|
|
|
extension Request {
|
|
|
- public func responseObject<T: ResponseObjectSerializable>(completionHandler: (NSURLRequest, NSHTTPURLResponse?, T?, NSError?) -> Void) -> Self {
|
|
|
+ public func responseObject<T: ResponseObjectSerializable>(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<T>) -> Void) -> Self {
|
|
|
let responseSerializer = GenericResponseSerializer<T> { request, response, data in
|
|
|
let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
|
|
|
- let (JSON: AnyObject?, serializationError) = JSONResponseSerializer.serializeResponse(request, response, data)
|
|
|
-
|
|
|
- if let response = response, JSON: AnyObject = JSON {
|
|
|
- return (T(response: response, representation: JSON), nil)
|
|
|
- } else {
|
|
|
- return (nil, serializationError)
|
|
|
+ let result = JSONResponseSerializer.serializeResponse(request, response, data)
|
|
|
+
|
|
|
+ switch result {
|
|
|
+ case .Success(let value):
|
|
|
+ if let
|
|
|
+ response = response,
|
|
|
+ responseObject = T(response: response, representation: value)
|
|
|
+ {
|
|
|
+ return .Success(responseObject)
|
|
|
+ } else {
|
|
|
+ let failureReason = "JSON could not be serialized into response object: \(value)"
|
|
|
+ let error = Error.errorWithCode(.StringSerializationFailed, failureReason: failureReason)
|
|
|
+ return .Failure(data, error)
|
|
|
+ }
|
|
|
+ case .Failure(let data, let error):
|
|
|
+ return .Failure(data, error)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -649,7 +663,7 @@ final class User: ResponseObjectSerializable {
|
|
|
let username: String
|
|
|
let name: String
|
|
|
|
|
|
- @objc required init?(response: NSHTTPURLResponse, representation: AnyObject) {
|
|
|
+ init?(response: NSHTTPURLResponse, representation: AnyObject) {
|
|
|
self.username = response.URL!.lastPathComponent!
|
|
|
self.name = representation.valueForKeyPath("name") as! String
|
|
|
}
|
|
|
@@ -658,28 +672,35 @@ final class User: ResponseObjectSerializable {
|
|
|
|
|
|
```swift
|
|
|
Alamofire.request(.GET, "http://example.com/users/mattt")
|
|
|
- .responseObject { (_, _, user: User?, _) in
|
|
|
- println(user)
|
|
|
+ .responseObject { (_, _, result: Result<User>) in
|
|
|
+ debugPrint(result)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
The same approach can also be used to handle endpoints that return a representation of a collection of objects:
|
|
|
|
|
|
```swift
|
|
|
-@objc public protocol ResponseCollectionSerializable {
|
|
|
- static func collection(#response: NSHTTPURLResponse, representation: AnyObject) -> [Self]
|
|
|
+public protocol ResponseCollectionSerializable {
|
|
|
+ static func collection(response response: NSHTTPURLResponse, representation: AnyObject) -> [Self]
|
|
|
}
|
|
|
|
|
|
extension Alamofire.Request {
|
|
|
- public func responseCollection<T: ResponseCollectionSerializable>(completionHandler: (NSURLRequest, NSHTTPURLResponse?, [T]?, NSError?) -> Void) -> Self {
|
|
|
+ public func responseCollection<T: ResponseCollectionSerializable>(completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<[T]>) -> Void) -> Self {
|
|
|
let responseSerializer = GenericResponseSerializer<[T]> { request, response, data in
|
|
|
let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments)
|
|
|
- let (JSON: AnyObject?, serializationError) = JSONSerializer.serializeResponse(request, response, data)
|
|
|
-
|
|
|
- if let response = response, JSON: AnyObject = JSON {
|
|
|
- return (T.collection(response: response, representation: JSON), nil)
|
|
|
- } else {
|
|
|
- return (nil, serializationError)
|
|
|
+ let result = JSONSerializer.serializeResponse(request, response, data)
|
|
|
+
|
|
|
+ switch result {
|
|
|
+ case .Success(let value):
|
|
|
+ if let response = response {
|
|
|
+ return .Success(T.collection(response: response, representation: value))
|
|
|
+ } else {
|
|
|
+ let failureReason = "Response collection could not be serialized due to nil response"
|
|
|
+ let error = Error.errorWithCode(.StringSerializationFailed, failureReason: failureReason)
|
|
|
+ return .Failure(data, error)
|
|
|
+ }
|
|
|
+ case .Failure(let data, let error):
|
|
|
+ return .Failure(data, error)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -689,16 +710,16 @@ extension Alamofire.Request {
|
|
|
```
|
|
|
|
|
|
```swift
|
|
|
-@objc final class User: ResponseObjectSerializable, ResponseCollectionSerializable {
|
|
|
+final class User: ResponseObjectSerializable, ResponseCollectionSerializable {
|
|
|
let username: String
|
|
|
let name: String
|
|
|
|
|
|
- required init?(response: NSHTTPURLResponse, representation: AnyObject) {
|
|
|
+ init?(response: NSHTTPURLResponse, representation: AnyObject) {
|
|
|
self.username = response.URL!.lastPathComponent!
|
|
|
self.name = representation.valueForKeyPath("name") as! String
|
|
|
}
|
|
|
|
|
|
- static func collection(#response: NSHTTPURLResponse, representation: AnyObject) -> [User] {
|
|
|
+ static func collection(response response: NSHTTPURLResponse, representation: AnyObject) -> [User] {
|
|
|
var users: [User] = []
|
|
|
|
|
|
if let representation = representation as? [[String: AnyObject]] {
|
|
|
@@ -716,8 +737,8 @@ extension Alamofire.Request {
|
|
|
|
|
|
```swift
|
|
|
Alamofire.request(.GET, "http://example.com/users")
|
|
|
- .responseCollection { (_, _, users: [User]?, _) in
|
|
|
- println(users)
|
|
|
+ .responseCollection { (_, _, result: Result<[User]>) in
|
|
|
+ debugPrint(result)
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -768,8 +789,13 @@ let mutableURLRequest = NSMutableURLRequest(URL: URL)
|
|
|
mutableURLRequest.HTTPMethod = "POST"
|
|
|
|
|
|
let parameters = ["foo": "bar"]
|
|
|
-var JSONSerializationError: NSError? = nil
|
|
|
-mutableURLRequest.HTTPBody = NSJSONSerialization.dataWithJSONObject(parameters, options: nil, error: &JSONSerializationError)
|
|
|
+
|
|
|
+do {
|
|
|
+ mutableURLRequest.HTTPBody = try NSJSONSerialization.dataWithJSONObject(parameters, options: NSJSONWritingOptions())
|
|
|
+} catch {
|
|
|
+ // No-op
|
|
|
+}
|
|
|
+
|
|
|
mutableURLRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
|
|
|
|
Alamofire.request(mutableURLRequest)
|
|
|
@@ -788,8 +814,8 @@ enum Router: URLRequestConvertible {
|
|
|
|
|
|
// MARK: URLRequestConvertible
|
|
|
|
|
|
- var URLRequest: NSURLRequest {
|
|
|
- let (path: String, parameters: [String: AnyObject]?) = {
|
|
|
+ var URLRequest: NSMutableURLRequest {
|
|
|
+ let result: (path: String, parameters: [String: AnyObject]) = {
|
|
|
switch self {
|
|
|
case .Search(let query, let page) where page > 1:
|
|
|
return ("/search", ["q": query, "offset": Router.perPage * page])
|
|
|
@@ -799,10 +825,10 @@ enum Router: URLRequestConvertible {
|
|
|
}()
|
|
|
|
|
|
let URL = NSURL(string: Router.baseURLString)!
|
|
|
- let URLRequest = NSURLRequest(URL: URL.URLByAppendingPathComponent(path))
|
|
|
+ let URLRequest = NSURLRequest(URL: URL.URLByAppendingPathComponent(result.path))
|
|
|
let encoding = Alamofire.ParameterEncoding.URL
|
|
|
|
|
|
- return encoding.encode(URLRequest, parameters: parameters).0
|
|
|
+ return encoding.encode(URLRequest, parameters: result.parameters).0
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
@@ -851,7 +877,7 @@ enum Router: URLRequestConvertible {
|
|
|
|
|
|
// MARK: URLRequestConvertible
|
|
|
|
|
|
- var URLRequest: NSURLRequest {
|
|
|
+ var URLRequest: NSMutableURLRequest {
|
|
|
let URL = NSURL(string: Router.baseURLString)!
|
|
|
let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
|
|
|
mutableURLRequest.HTTPMethod = method.rawValue
|