Skip to content

Commit cc32258

Browse files
committed
Merge pull request #83 from inamiy/nullable-parameter-value
Fix parameter type from [String:AnyObject] to [String:AnyObject?] for nullable value.
2 parents ab49f07 + 2e141ba commit cc32258

4 files changed

+24
-9
lines changed

APIKit/RequestType.swift

+15-5
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public protocol RequestType {
1616
var baseURL: NSURL { get }
1717
var method: HTTPMethod { get }
1818
var path: String { get }
19-
var parameters: [String: AnyObject] { get }
19+
var parameters: [String: AnyObject?] { get }
2020

2121
/// You can add any configurations here
2222
///
@@ -45,7 +45,7 @@ public protocol RequestType {
4545

4646
/// Default implementation of RequestType protocol
4747
public extension RequestType {
48-
public var parameters: [String: AnyObject] {
48+
public var parameters: [String: AnyObject?] {
4949
return [:]
5050
}
5151

@@ -78,15 +78,16 @@ public extension RequestType {
7878
}
7979

8080
let URLRequest = NSMutableURLRequest()
81-
81+
let paramObject = parametersToAnyObject(parameters)
82+
8283
switch method {
8384
case .GET, .HEAD, .DELETE:
8485
if parameters.count > 0 {
85-
components.percentEncodedQuery = URLEncodedSerialization.stringFromDictionary(parameters)
86+
components.percentEncodedQuery = URLEncodedSerialization.stringFromDictionary(paramObject)
8687
}
8788
default:
8889
do {
89-
URLRequest.HTTPBody = try requestBodyBuilder.buildBodyFromObject(parameters)
90+
URLRequest.HTTPBody = try requestBodyBuilder.buildBodyFromObject(paramObject)
9091
} catch {
9192
return .Failure(.RequestBodySerializationError(error))
9293
}
@@ -133,3 +134,12 @@ public extension RequestType {
133134
return .Success(response)
134135
}
135136
}
137+
138+
/// Convert `var parameters: [String: AnyObject?]` (non-AnyObject) to AnyObject using NSNull
139+
private func parametersToAnyObject(parameters: [String: AnyObject?]) -> [String: AnyObject] {
140+
var object = [String: AnyObject]()
141+
for (key, value) in parameters {
142+
object[key] = value ?? NSNull()
143+
}
144+
return object
145+
}

APIKit/URLEncodedSerialization.swift

+4
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ public final class URLEncodedSerialization {
6262

6363
public static func stringFromDictionary(dictionary: [String: AnyObject]) -> String {
6464
let pairs = dictionary.map { key, value -> String in
65+
guard (value is NSNull) == false else {
66+
return "\(escape(key))"
67+
}
68+
6569
let valueAsString = (value as? String) ?? "\(value)"
6670
return "\(escape(key))=\(escape(valueAsString))"
6771
}

APIKitTests/RequestCreateTaskInURLSessionTests.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class RequestCreateTaskInURLSessionTest: XCTestCase {
1818
var baseURL: NSURL { return NSURL(string: b)! }
1919
var method: HTTPMethod { return m }
2020
var path: String { return p }
21-
var parameters: [String: AnyObject] { return params }
21+
var parameters: [String: AnyObject?] { return params }
2222
func responseFromObject(object: AnyObject, URLResponse: NSHTTPURLResponse) -> Response? { return nil }
2323
}
2424

APIKitTests/RequestTests.swift

+4-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ class RequestTests: XCTestCase {
1717
return "/"
1818
}
1919

20-
var parameters: [String: AnyObject] {
20+
var parameters: [String: AnyObject?] {
2121
return [
2222
"q": query,
23+
"dummy": nil
2324
]
2425
}
2526

@@ -35,7 +36,7 @@ class RequestTests: XCTestCase {
3536

3637
func testJapanesesURLQueryParameterEncoding() {
3738
OHHTTPStubs.stubRequestsPassingTest({ request in
38-
XCTAssert(request.URL?.query == "q=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF")
39+
XCTAssert(request.URL?.query == "q=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF&dummy")
3940
return true
4041
}, withStubResponse: { request in
4142
return OHHTTPStubsResponse(data: NSData(), statusCode: 200, headers: nil)
@@ -53,7 +54,7 @@ class RequestTests: XCTestCase {
5354

5455
func testSymbolURLQueryParameterEncoding() {
5556
OHHTTPStubs.stubRequestsPassingTest({ request in
56-
XCTAssert(request.URL?.query == "q=%21%22%23%24%25%26%27%28%290%3D~%7C%60%7B%7D%2A%2B%3C%3E%3F_")
57+
XCTAssert(request.URL?.query == "q=%21%22%23%24%25%26%27%28%290%3D~%7C%60%7B%7D%2A%2B%3C%3E%3F_&dummy")
5758
return true
5859
}, withStubResponse: { request in
5960
return OHHTTPStubsResponse(data: NSData(), statusCode: 200, headers: nil)

0 commit comments

Comments
 (0)