diff --git a/Sources/APIKit/Serializations/URLEncodedSerialization.swift b/Sources/APIKit/Serializations/URLEncodedSerialization.swift index 1c13425d..7aad0a93 100644 --- a/Sources/APIKit/Serializations/URLEncodedSerialization.swift +++ b/Sources/APIKit/Serializations/URLEncodedSerialization.swift @@ -94,6 +94,14 @@ public final class URLEncodedSerialization { return "\(escape(key))" } + if let valueAsArray = value as? Array { + let escapedKeyForArray = escape(key) + return valueAsArray.map { (element: Any) -> String in + let elementAsString = (element as? String) ?? "\(element)" + return "\(escapedKeyForArray)=\(escape(elementAsString))" + }.joined(separator: "&") + } + let valueAsString = (value as? String) ?? "\(value)" return "\(escape(key))=\(escape(valueAsString))" } diff --git a/Tests/APIKitTests/BodyParametersType/URLEncodedSerializationTests.swift b/Tests/APIKitTests/BodyParametersType/URLEncodedSerializationTests.swift index 64d33cf4..5d455680 100644 --- a/Tests/APIKitTests/BodyParametersType/URLEncodedSerializationTests.swift +++ b/Tests/APIKitTests/BodyParametersType/URLEncodedSerializationTests.swift @@ -10,6 +10,14 @@ class URLEncodedSerializationTests: XCTestCase { XCTAssertEqual(object?["key1"], "value1") XCTAssertEqual(object?["key2"], "value2") } + + func testObjectFromArray() { + let parameters: [String : Any] = ["foo": "bar", "array" : ["first", "second"]] + let serailizedString = URLEncodedSerialization.string(from: parameters) + XCTAssertTrue(serailizedString.contains("foo=bar")) + XCTAssertTrue(serailizedString.contains("array=first")) + XCTAssertTrue(serailizedString.contains("array=second")) + } func testInvalidFormatString() throws { let string = "key==value&"