A customizable Swift Encoder
that encodes instances of data types as URL query items. Supports all [OpenAPI] query parameter serialization options.
let encoder = URLQueryEncoder()
encoder.encode(id, forKey: "id")
print(encoder.queryItems)
// [URLQueryItem(name: "id", value: "5")]
let ids = [3, 4, 5]
let encoder = URLQueryEncoder()
encoder.encode(ids, forKey: "id")
// Query: "id=3&id=4&id=5"
With an explode
option disabled:
let ids = [3, 4, 5]
let encoder = URLQueryEncoder()
encoder.encode(ids, forKey: "id", explode: false)
// Query: "id=3,4,5"
With an explode
option disabled and a custom delimiter:
let ids = [3, 4, 5]
let encoder = URLQueryEncoder()
encoder.encode(ids, forKey: "id", explode: false, delimeter: "|")
// Query: "id=3|4|5"
let user = User(role: "admin", name: "kean")
let encoder = URLQueryEncoder()
encoder.encode(user, forKey: "id")
// Query: "role=admin&name=kean"
With an explode
option disabled:
let user = User(role: "admin", name: "kean")
let encoder = URLQueryEncoder()
encoder.encode(user, forKey: "id", explode: false)
// Query: "id=role,admin,name,kean"
As a "deep" object:
let user = User(role: "admin", name: "kean")
let encoder = URLQueryEncoder()
encoder.encode(user, forKey: "id", isDeepObject: true)
// Query: "id[role]=admin&id[name]=kean")"
If you are encoding a request body using URL-form encoding, you can use a convenience
URLQueryEncoder(encoding: body
initializer.
There are two ways to change the encoding options: settings them directly on URLQueryEncoder
instance, or passing options in each individual encode
call. The reason it's designed this way is that in OpenAPI, each parameter can have different serialization options.
let encoder = URLQueryEncoder()
encoder.explode = false
encoder.isDeepObject = true
encoder.delimiter = "|"
encoder.dateEncodingStrategy = .millisecondsSince1970
You can use URLQueryEncoder
to encode more that one parameter are a time:
let user = User(role: "admin", name: "kean")
let ids = [3, 4, 5]
let query = URLQueryEncoder()
.encode(ids, forKey: "ids", explode: false)
.encode(ids, forKey: "ids2", explode: true)
.encode(user, forKey: "user", isDeepObject: true)
.encode(2, forKey: "id")
.query
// Query: "ids=3,4,5&ids2=3&ids2=4&ids2=5&user[role]=admin&user[name]=kean&id=2"
You can access the encoding results at any time, and they come in different forms:
public final class URLQueryEncoder {
// Encoded query items.
public var queryItems: [URLQueryItem]
// Encoded query items as name-value pairs.
public var items: [(String, String?)]
// The encoded query items as a URL query subcomponent.
public var query: String?
// The encoded query items as a URL query subcomponent with percent-encoded values.
public var percentEncodedQuery: String?
}
URLQueryEncoder is available under the MIT license. See the LICENSE file for more info.