A customizable Swift Encoder that encodes instances of data types as URL query items. Supports all OpenAPI serialization options.
letencoder=URLQueryEncoder() encoder.encode(id, forKey:"id")print(encoder.queryItems) // [URLQueryItem(name: "id", value: "5")]By default, optional values are not encoded.
varid:Int?letencoder=URLQueryEncoder() encoder.encode(id, forKey:"id")print(encoder.queryItems) // []letids=[3,4,5]letencoder=URLQueryEncoder() encoder.encode(ids, forKey:"id") // Query: "id=3&id=4&id=5"With an explode option disabled:
letids=[3,4,5]letencoder=URLQueryEncoder() encoder.encode(ids, forKey:"id", explode:false) // Query: "id=3,4,5"With an explode option disabled and a custom delimiter:
letids=[3,4,5]letencoder=URLQueryEncoder() encoder.encode(ids, forKey:"id", explode:false, delimeter:"|") // Query: "id=3|4|5"letuser=User(role:"admin", name:"kean")letencoder=URLQueryEncoder() encoder.encode(user, forKey:"id") // Query: "role=admin&name=kean"With an explode option disabled:
letuser=User(role:"admin", name:"kean")letencoder=URLQueryEncoder() encoder.encode(user, forKey:"id", explode:false) // Query: "id=role,admin,name,kean"As a "deep" object:
letuser=User(role:"admin", name:"kean")letencoder=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.encode(_:)method.
There are two ways to change the encoding options. You can set them directly on URLQueryEncoder instance.
letencoder=URLQueryEncoder() encoder.explode =false encoder.isDeepObject =true encoder.delimiter ="|" encoder.dateEncodingStrategy =.millisecondsSince1970Or pass options in each individual encode call.
letuser=User(role:"admin", name:"kean")letids=[3,4,5]letencoder=URLQueryEncoder() encoder.encode(ids, forKey:"ids", explode:false) encoder.encode(ids, forKey:"ids2", explode:true) encoder.encode(user, forKey:"user", isDeepObject:true) encoder.encode(2, forKey:"id") // Query: "ids=3,4,5&ids2=3&ids2=4&ids2=5&user[role]=admin&user[name]=kean&id=2"The reason it's designed this way is that in OpenAPI each parameter can come with different serialization options.
You can access the encoding results at any time, and they come in different forms:
publicfinalclassURLQueryEncoder{ // Encoded query items. publicvarqueryItems:[URLQueryItem] // Encoded query items as name-value pairs. publicvaritems:[(String,String?)] // The encoded query items as a URL query subcomponent. publicvarquery:String? // The encoded query items as a URL query subcomponent with percent-encoded values. publicvarpercentEncodedQuery:String?}URLQueryEncoder is available under the MIT license. See the LICENSE file for more info.