Home > Back-end >  How to fix URLQueryItem in swift
How to fix URLQueryItem in swift

Time:05-17

I need to pass an query param to my URLComponents:

URLQueryItem(name: "scope", value: "channel:manage:polls channel:read:polls")

but when i see the url in debug i see this :

scope=channel%3Amanage%3Apolls channel%3Aread%3Apolls

The %3 transforms in %3. Why does this happen?

CodePudding user response:

Don’t percent-encode the value you supply to URLQueryItem. URLQueryItem does that for you. As it is, you are double percent-encoding it (i.e., it is percent-encoding the % of your percent-encoded string).

So, instead, simply supply the simple string, and let URLComponents take care of it:

let queryItem = URLQueryItem(name: "scope", value: "channel:manage:polls channel:read:polls")

As an aside, the : characters do not need to be percent-encoded when encountered within a query, anyway. E.g.:

let queryItem = URLQueryItem(name: "scope", value: "channel:manage:polls channel:read:polls")

var components = URLComponents(string: "https://example.com")
components?.queryItems = [
    queryItem
]

guard let url = components?.url else { return }

print(url) // https://example.com?scope=channel:manage:polls channel:read:polls

See RFC3986, in which, if you trace query back to pchar, you will see that : does not need to be escaped.

But if there really was anything in that query that needed percent-encoding, URLQueryItem and URLComponents would take care of it for you. (The one exception is the character as discussed here; but I assume from your example that you didn’t want that escaped anyway.)

  • Related