GET
요청을 작성할 때 요청에 본문이 없지만 모든 것이 URL에 있습니다. URL을 작성하고 적절하게 이스케이프 처리하려면을 사용할 수도 있습니다 URLComponents
.
var url = URLComponents(string: "https://www.google.com/search/")!
url.queryItems = [
URLQueryItem(name: "q", value: "War & Peace")
]
유일한 트릭은 대부분의 웹 서비스가 +
문자 퍼센트 이스케이프 가 필요하다는 것입니다 (왜냐하면 application/x-www-form-urlencoded
사양 에 따라 공백 문자로 해석되기 때문입니다 ). 그러나 URLComponents
퍼센트가 그것을 벗어나지는 않을 것입니다. Apple +
은 쿼리에서 유효한 문자이므로 이스케이프해서는 안된다고 주장합니다. 기술적으로는 정확하고 URI 쿼리에서 허용되지만 application/x-www-form-urlencoded
요청 에는 특별한 의미 가 있으며 실제로 이스케이프되지 않은 상태로 전달되어서는 안됩니다.
Apple은 +
문자 를 퍼센트 이스케이프해야 함을 인정 하지만 수동으로 수행 할 것을 권장합니다.
var url = URLComponents(string: "https://www.wolframalpha.com/input/")!
url.queryItems = [
URLQueryItem(name: "i", value: "1+2")
]
url.percentEncodedQuery = url.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B")
이것은 비정상적인 해결 방법이지만 작동하며 쿼리에 +
문자 가 포함될 수 있고 이를 공백으로 해석하는 서버가있는 경우 Apple이 권장하는 것 입니다.
그래서 그것을 sendRequest
일상 과 결합 하면 다음과 같은 결과를 얻게됩니다.
func sendRequest(_ url: String, parameters: [String: String], completion: @escaping ([String: Any]?, Error?) -> Void) {
var components = URLComponents(string: url)!
components.queryItems = parameters.map { (key, value) in
URLQueryItem(name: key, value: value)
}
components.percentEncodedQuery = components.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B")
let request = URLRequest(url: components.url!)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data,
let response = response as? HTTPURLResponse,
(200 ..< 300) ~= response.statusCode,
error == nil else {
completion(nil, error)
return
}
let responseObject = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any]
completion(responseObject, nil)
}
task.resume()
}
그리고 당신은 그것을 다음과 같이 부를 것입니다.
sendRequest("someurl", parameters: ["foo": "bar"]) { responseObject, error in
guard let responseObject = responseObject, error == nil else {
print(error ?? "Unknown error")
return
}
}
개인적으로 나는 JSONDecoder
요즘struct
하고 사전이 아닌 사용자 정의를 반환 하지만 여기서는 실제로 관련이 없습니다. 바라건대 이것은 매개 변수를 GET 요청의 URL로 퍼센트 인코딩하는 방법에 대한 기본 아이디어를 보여줍니다.
Swift 2 및 수동 이스케이프 변환에 대한 이 답변의 이전 개정판을 참조하십시오 .
extension string
가치 에 대해 무엇을하고 있는지에 대해 여전히 약간 혼란 스럽 습니까? 또한 언제 사용해야HttpBody
합니까?