Skip to content

URL query encoder with support for all OpenAPI serialization options

License

Notifications You must be signed in to change notification settings

dmank/URLQueryEncoder

Repository files navigation

URLQueryEncoder

A customizable Swift Encoder that encodes instances of data types as URL query items. Supports all OpenAPI serialization options.

Examples

Encoding Primitives

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) // []

Encoding Arrays

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"

Encoding Objects

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.

Encoding Options

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 =.millisecondsSince1970

Or 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.

Accessing Results

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?}

License

URLQueryEncoder is available under the MIT license. See the LICENSE file for more info.

About

URL query encoder with support for all OpenAPI serialization options

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift100.0%