Add url encode switch to api route

This commit is contained in:
Daniel Saidi 2021-05-02 00:57:08 +02:00
parent 790da03409
commit 4969f38b19
3 changed files with 19 additions and 3 deletions

View File

@ -8,6 +8,7 @@ Until 1.0, breaking changes can occur in minor versions.
### ✨ New features
* `ApiRoute` has more explicit properties for working with post data.
* `ApiRoute` has a new `shouldUrlEncodeParams` parameter.
* `iCloudDocumentSync` is a new protocol for syncing iCloud document changes.
* `String+Slugify` is a new extension that can convert a string to a slugified version.
* `StandardiCloudDocumentSync` is a new class for syncing iCloud document changes.
@ -15,7 +16,7 @@ Until 1.0, breaking changes can occur in minor versions.
### 💡 Behavior changes
* `ApiRoute` now url encodes query and post parameter values.
* `ApiRoute` has more required properties.
* `URL+setQueryParameter` no longer url encodes the strings you send in.
### 💥 Breaking changes

View File

@ -46,6 +46,13 @@ public protocol ApiRoute {
performing a request.
*/
var queryParams: [String: String] { get }
/**
Whether or not the route should url encode its post and
query params. Return `false` if the params will contain
chars that mustn't be url encoded, like array brackets.
*/
var urlEncodeParams: Bool { get }
}
public extension ApiRoute {
@ -65,7 +72,7 @@ public extension ApiRoute {
var postParamsString: String? {
var params = URLComponents()
params.queryItems = postParams
.map { URLQueryItem(name: $0.key, value: $0.value.urlEncoded()) }
.map { URLQueryItem(name: $0.key, value: paramValue(for: $0.value)) }
.sorted { $0.name < $1.name }
return params.query
}
@ -75,7 +82,7 @@ public extension ApiRoute {
*/
var queryItems: [URLQueryItem] {
queryParams
.map { URLQueryItem(name: $0.key, value: $0.value.urlEncoded()) }
.map { URLQueryItem(name: $0.key, value: paramValue(for: $0.value)) }
.sorted { $0.name < $1.name }
}
@ -121,3 +128,10 @@ public extension ApiRoute {
environment.url.appendingPathComponent(path)
}
}
private extension ApiRoute {
func paramValue(for value: String) -> String? {
urlEncodeParams ? value.urlEncoded() : value
}
}

View File

@ -84,4 +84,5 @@ private struct TestRoute: ApiRoute {
var postData: Data? { nil }
var postParams: [String: String] { ["foo&": "bar&", "baz?": "BAM?"] }
var queryParams: [String: String] { ["hello&": "world&", "anyone?": "there?"] }
var urlEncodeParams: Bool { true }
}