diff --git a/APIKit/APIKit.swift b/APIKit/APIKit.swift index c1bfbfa0..0fa764f0 100644 --- a/APIKit/APIKit.swift +++ b/APIKit/APIKit.swift @@ -37,11 +37,11 @@ public class API { } public class func requestBodyBuilder() -> RequestBodyBuilder { - return .JSON(nil) + return .JSON(writingOptions: nil) } public class func responseBodyParser() -> ResponseBodyParser { - return .JSON(nil) + return .JSON(readingOptions: nil) } // build NSURLRequest @@ -66,6 +66,8 @@ public class API { components.path = (components.path ?? "").stringByAppendingPathComponent(path) request.URL = components.URL request.HTTPMethod = method.rawValue + request.setValue(requestBodyBuilder().contentTypeHeader, forHTTPHeaderField: "Content-Type") + request.setValue(responseBodyParser().acceptHeader, forHTTPHeaderField: "Accept") return request } else { diff --git a/APIKit/RequestBodyBuilder.swift b/APIKit/RequestBodyBuilder.swift index 85705dcd..6766d4a8 100644 --- a/APIKit/RequestBodyBuilder.swift +++ b/APIKit/RequestBodyBuilder.swift @@ -7,9 +7,22 @@ import LlamaKit public let APIKitRequestBodyBuidlerErrorDomain = "APIKitRequestBodyBuidlerErrorDomain" public enum RequestBodyBuilder { - case JSON(NSJSONWritingOptions) - case URL(NSStringEncoding) - case Custom(AnyObject -> Result) + case JSON(writingOptions: NSJSONWritingOptions) + case URL(encoding: NSStringEncoding) + case Custom(contentTypeHeader: String, buildBodyFromObject: AnyObject -> Result) + + public var contentTypeHeader: String { + switch self { + case .JSON: + return "application/json" + + case .URL: + return "application/x-www-form-urlencoded" + + case .Custom(let (type, _)): + return type + } + } public func buildBodyFromObject(object: AnyObject) -> Result { var result: Result @@ -38,7 +51,7 @@ public enum RequestBodyBuilder { result = Result.Failure(Box(error!)) } - case .Custom(let buildBodyFromObject): + case .Custom(let (_, buildBodyFromObject)): result = buildBodyFromObject(object) } diff --git a/APIKit/ResponseBodyParser.swift b/APIKit/ResponseBodyParser.swift index 8db90748..a74977af 100644 --- a/APIKit/ResponseBodyParser.swift +++ b/APIKit/ResponseBodyParser.swift @@ -5,9 +5,22 @@ import LlamaKit #endif public enum ResponseBodyParser { - case JSON(NSJSONReadingOptions) - case URL(NSStringEncoding) - case Custom(NSData -> Result) + case JSON(readingOptions: NSJSONReadingOptions) + case URL(encoding: NSStringEncoding) + case Custom(acceptHeader: String, parseData: NSData -> Result) + + public var acceptHeader: String { + switch self { + case .JSON: + return "application/json" + + case .URL: + return "application/x-www-form-urlencoded" + + case .Custom(let (type, _)): + return type + } + } public func parseData(data: NSData) -> Result { var result: Result @@ -29,10 +42,12 @@ public enum ResponseBodyParser { result = Result.Failure(Box(error!)) } - case .Custom(let parseData): + case .Custom(let (accept, parseData)): result = parseData(data) } return result } + + } diff --git a/APIKitTests/RequestBodyBuilderTests.swift b/APIKitTests/RequestBodyBuilderTests.swift index 955d4401..1b44e79f 100644 --- a/APIKitTests/RequestBodyBuilderTests.swift +++ b/APIKitTests/RequestBodyBuilderTests.swift @@ -4,9 +4,14 @@ import LlamaKit import XCTest class RequestBodyBuilderTests: XCTestCase { + func testJSONHeader() { + let builder = RequestBodyBuilder.JSON(writingOptions: nil) + XCTAssertEqual(builder.contentTypeHeader, "application/json") + } + func testJSONSuccess() { let object = ["foo": 1, "bar": 2, "baz": 3] - let builder = RequestBodyBuilder.JSON(nil) + let builder = RequestBodyBuilder.JSON(writingOptions: nil) switch builder.buildBodyFromObject(object) { case .Success(let box): @@ -22,7 +27,7 @@ class RequestBodyBuilderTests: XCTestCase { func testJSONFailure() { let object = NSObject() - let builder = RequestBodyBuilder.JSON(nil) + let builder = RequestBodyBuilder.JSON(writingOptions: nil) switch builder.buildBodyFromObject(object) { case .Success: @@ -35,9 +40,14 @@ class RequestBodyBuilderTests: XCTestCase { } } + func testURLHeader() { + let builder = RequestBodyBuilder.URL(encoding: NSUTF8StringEncoding) + XCTAssertEqual(builder.contentTypeHeader, "application/x-www-form-urlencoded") + } + func testURLSuccess() { let object = ["foo": 1, "bar": 2, "baz": 3] - let builder = RequestBodyBuilder.URL(NSUTF8StringEncoding) + let builder = RequestBodyBuilder.URL(encoding: NSUTF8StringEncoding) switch builder.buildBodyFromObject(object) { case .Success(let box): @@ -49,10 +59,15 @@ class RequestBodyBuilderTests: XCTestCase { } } + func testCustomHeader() { + let builder = RequestBodyBuilder.Custom(contentTypeHeader: "foo", buildBodyFromObject: { o in Result.Success(Box(o as NSData)) }) + XCTAssertEqual(builder.contentTypeHeader, "foo") + } + func testCustomSuccess() { let string = "foo" let expectedData = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! - let builder = RequestBodyBuilder.Custom({ object in + let builder = RequestBodyBuilder.Custom(contentTypeHeader: "", buildBodyFromObject: { object in return Result.Success(Box(expectedData)) }) @@ -68,7 +83,7 @@ class RequestBodyBuilderTests: XCTestCase { func testCustomFailure() { let string = "foo" let expectedError = NSError() - let builder = RequestBodyBuilder.Custom({ object in + let builder = RequestBodyBuilder.Custom(contentTypeHeader: "", buildBodyFromObject: { object in return Result.Failure(Box(expectedError)) }) diff --git a/APIKitTests/ResponseBodyParserTests.swift b/APIKitTests/ResponseBodyParserTests.swift index 76409129..ec2399c6 100644 --- a/APIKitTests/ResponseBodyParserTests.swift +++ b/APIKitTests/ResponseBodyParserTests.swift @@ -4,10 +4,15 @@ import LlamaKit import XCTest class ResponseBodyParserTests: XCTestCase { + func testJSONAcceptHeader() { + let parser = ResponseBodyParser.JSON(readingOptions: nil) + XCTAssertEqual(parser.acceptHeader, "application/json") + } + func testJSONSuccess() { let string = "{\"foo\": 1, \"bar\": 2, \"baz\": 3}" let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! - let parser = ResponseBodyParser.JSON(nil) + let parser = ResponseBodyParser.JSON(readingOptions: nil) switch parser.parseData(data) { case .Success(let box): @@ -24,7 +29,7 @@ class ResponseBodyParserTests: XCTestCase { func testJSONFailure() { let string = "{\"foo\": 1, \"bar\": 2, \" 3}" let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! - let parser = ResponseBodyParser.JSON(nil) + let parser = ResponseBodyParser.JSON(readingOptions: nil) switch parser.parseData(data) { case .Success: @@ -37,10 +42,15 @@ class ResponseBodyParserTests: XCTestCase { } } + func testURLAcceptHeader() { + let parser = ResponseBodyParser.URL(encoding: NSUTF8StringEncoding) + XCTAssertEqual(parser.acceptHeader, "application/x-www-form-urlencoded") + } + func testURLSuccess() { let string = "foo=1&bar=2&baz=3" let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! - let parser = ResponseBodyParser.URL(NSUTF8StringEncoding) + let parser = ResponseBodyParser.URL(encoding: NSUTF8StringEncoding) switch parser.parseData(data) { case .Success(let box): @@ -53,11 +63,16 @@ class ResponseBodyParserTests: XCTestCase { XCTFail() } } + + func testCustomAcceptHeader() { + let parser = ResponseBodyParser.Custom(acceptHeader: "foo", parseData: { d in Result.Success(Box(d)) }) + XCTAssertEqual(parser.acceptHeader, "foo") + } func testCustomSuccess() { let expectedDictionary = ["foo": 1] let data = NSData() - let parser = ResponseBodyParser.Custom({ data in + let parser = ResponseBodyParser.Custom(acceptHeader: "", parseData: { data in return Result.Success(Box(expectedDictionary)) }) @@ -74,7 +89,7 @@ class ResponseBodyParserTests: XCTestCase { func testCustomFailure() { let expectedError = NSError() let data = NSData() - let parser = ResponseBodyParser.Custom({ data in + let parser = ResponseBodyParser.Custom(acceptHeader: "", parseData: { data in return Result.Failure(Box(expectedError)) }) diff --git a/DemoApp/GitHub.swift b/DemoApp/GitHub.swift index a6af6cfa..c29ce9e7 100644 --- a/DemoApp/GitHub.swift +++ b/DemoApp/GitHub.swift @@ -8,11 +8,11 @@ class GitHub: API { } override class func requestBodyBuilder() -> RequestBodyBuilder { - return .JSON(nil) + return .JSON(writingOptions: nil) } override class func responseBodyParser() -> ResponseBodyParser { - return .JSON(nil) + return .JSON(readingOptions: nil) } class Request { diff --git a/README.md b/README.md index 28cf79d1..19761e13 100644 --- a/README.md +++ b/README.md @@ -51,11 +51,11 @@ You have 2 choices. If your app supports iOS 7.0, you can only choose copying so ## Usage -1. Create subclass of `APIKit.API` that represents target web API. +1. Create subclass of `API` that represents target web API. 2. Set base URL by overriding `baseURL()`. 3. Set encoding of request body by overriding `requestBodyBuilder()`. 4. Set encoding of response body by overriding `responseBodyParser()`. -5. Define request classes that conforms to `APIKit.Request` for each endpoints. +5. Define request classes that conforms to `Request` for each endpoints. ### Example @@ -66,11 +66,11 @@ class GitHub: API { } override class func requestBodyBuilder() -> RequestBodyBuilder { - return .JSON(nil) + return .JSON(writingOptions: nil) } override class func responseBodyParser() -> ResponseBodyParser { - return .JSON(nil) + return .JSON(readingOptions: nil) } class Endpoint {