매개 변수가 포함된 Swift GET 요청
저는 swift가 처음이라 아마 제 코드에 많은 결함이 있을 것입니다. 하지만 제가 이루고자 하는 것은 a를 보내는 것입니다.GET
매개 변수가 있는 로컬 호스트 서버로 요청합니다.그래서 나는 내 함수가 두 개의 매개변수를 갖는 것을 고려하여 그것을 달성하려고 노력하고 있습니다.baseURL:string,params:NSDictionary
. 실제 URL 요청에 이 두 가지를 결합하는 방법을 잘 모르겠습니다.제가 지금까지 시도한 것은 이렇습니다.
func sendRequest(url:String,params:NSDictionary){
let urls: NSURL! = NSURL(string:url)
var request = NSMutableURLRequest(URL:urls)
request.HTTPMethod = "GET"
var data:NSData! = NSKeyedArchiver.archivedDataWithRootObject(params)
request.HTTPBody = data
println(request)
var session = NSURLSession.sharedSession()
var task = session.dataTaskWithRequest(request, completionHandler:loadedData)
task.resume()
}
}
func loadedData(data:NSData!,response:NSURLResponse!,err:NSError!){
if(err != nil){
println(err?.description)
}else{
var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
println(jsonResult)
}
}
A를 만들때GET
request, request에 대한 body는 없고 오히려 모든 것이 URL로 넘어갑니다.URL을 구축하려면(그리고 적절한 비율로 탈출하려면)URLComponents
.
var url = URLComponents(string: "https://www.google.com/search/")!
url.queryItems = [
URLQueryItem(name: "q", value: "War & Peace")
]
유일한 방법은 대부분의 웹 서비스가 필요하다는 것입니다.+
문자 백분율이 탈출했습니다(명세에 따라 지정된 공백 문자로 해석하기 때문입니다). 하지만URLComponents
탈출하지 못할 겁니다애플은 다음과 같이 주장합니다.+
쿼리에서 유효한 문자이므로 이스케이프해서는 안 됩니다.기술적으로, 그것이 URI의 쿼리에서 허용된다는 것은 옳지만, 그것은 특별한 의미를 가지고 있습니다.application/x-www-form-urlencoded
요청사항을 전달할 수 없습니다.
애플은 우리가 탈출해야 한다는 것을 인정합니다.+
문자를 사용하지만 수동으로 수행할 것을 권장합니다.
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")
이것은 우둔한 해결책이지만, 효과가 있으며, 만약 당신의 질의에 다음과 같은 정보가 포함될 수 있다면 애플이 조언하는 것입니다.+
문자를 공백으로 해석하는 서버가 있습니다.
그래서, 당신의 그것과 당신의 것을 합하면,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, // is there data
let response = response as? HTTPURLResponse, // is there HTTP response
200 ..< 300 ~= response.statusCode, // is statusCode 2XX
error == nil // was there no error
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
}
// use `responseObject` here
}
저는 개인적으로.JSONDecoder
요즘에는 관습을 돌려줍니다.struct
사전이라기 보다는, 하지만 여기서는 별로 상관이 없습니다.이것이 GET 요청의 URL에 매개 변수를 백분율로 인코딩하는 방법에 대한 기본 아이디어를 보여주기를 바랍니다.
Swift 2 및 수동 탈출 실행에 대해서는 이 답변의 이전 개정판을 참조하십시오.
NSURL 구성요소를 사용하여 다음과 같이 NSURL을 구축합니다.
var urlComponents = NSURLComponents(string: "https://www.google.de/maps/")!
urlComponents.queryItems = [
NSURLQueryItem(name: "q", value: String(51.500833)+","+String(-0.141944)),
NSURLQueryItem(name: "z", value: String(6))
]
urlComponents.URL // returns https://www.google.de/maps/?q=51.500833,-0.141944&z=6
출처 : https://www.ralfebert.de/snippets/ios/encoding-nsurl-get-parameters/
저는 이걸 쓰고 있어요, 놀이터에서 써보세요.기본 URL을 Structin Constants로 정의
struct Constants {
struct APIDetails {
static let APIScheme = "https"
static let APIHost = "restcountries.eu"
static let APIPath = "/rest/v1/alpha/"
}
}
private func createURLFromParameters(parameters: [String:Any], pathparam: String?) -> URL {
var components = URLComponents()
components.scheme = Constants.APIDetails.APIScheme
components.host = Constants.APIDetails.APIHost
components.path = Constants.APIDetails.APIPath
if let paramPath = pathparam {
components.path = Constants.APIDetails.APIPath + "\(paramPath)"
}
if !parameters.isEmpty {
components.queryItems = [URLQueryItem]()
for (key, value) in parameters {
let queryItem = URLQueryItem(name: key, value: "\(value)")
components.queryItems!.append(queryItem)
}
}
return components.url!
}
let url = createURLFromParameters(parameters: ["fullText" : "true"], pathparam: "IN")
//Result url= https://restcountries.eu/rest/v1/alpha/IN?fullText=true
스위프트 3:
extension URL {
func getQueryItemValueForKey(key: String) -> String? {
guard let components = NSURLComponents(url: self, resolvingAgainstBaseURL: false) else {
return nil
}
guard let queryItems = components.queryItems else { return nil }
return queryItems.filter {
$0.name.lowercased() == key.lowercased()
}.first?.value
}
}
이미지 이름을 얻기 위해 사용했습니다.UIImagePickerController
인에func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
:
var originalFilename = ""
if let url = info[UIImagePickerControllerReferenceURL] as? URL, let imageIdentifier = url.getQueryItemValueForKey(key: "id") {
originalFilename = imageIdentifier + ".png"
print("file name : \(originalFilename)")
}
확장 가능합니다.Dictionary
제공만 하기 위해stringFromHttpParameter
키와 가치가 모두 부합하는 경우CustomStringConvertable
이것처럼.
extension Dictionary where Key : CustomStringConvertible, Value : CustomStringConvertible {
func stringFromHttpParameters() -> String {
var parametersString = ""
for (key, value) in self {
parametersString += key.description + "=" + value.description + "&"
}
return parametersString
}
}
이것은 훨씬 더 깨끗하며 실수로 전화하는 것을 막습니다.stringFromHttpParameters
그 방법을 부를 일이 없는 사전에.
@Rob이 제안한 이 확장은 Swift 3.0.1에 적용됩니다.
Xcode 8.1(8B62)로 그의 게시물에 포함된 버전을 컴파일할 수 없었습니다.
extension Dictionary {
/// Build string representation of HTTP parameter dictionary of keys and objects
///
/// :returns: String representation in the form of key1=value1&key2=value2 where the keys and values are percent escaped
func stringFromHttpParameters() -> String {
var parametersString = ""
for (key, value) in self {
if let key = key as? String,
let value = value as? String {
parametersString = parametersString + key + "=" + value + "&"
}
}
parametersString = parametersString.substring(to: parametersString.index(before: parametersString.endIndex))
return parametersString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!
}
}
사용 용도:
let dictionary = ["method":"login_user",
"cel":mobile.text!
"password":password.text!] as Dictionary<String,String>
for (key, value) in dictionary {
data=data+"&"+key+"="+value
}
request.HTTPBody = data.dataUsingEncoding(NSUTF8StringEncoding);
언급URL : https://stackoverflow.com/questions/27723912/swift-get-request-with-parameters
'programing' 카테고리의 다른 글
pHPUnit에서 clover.xml을 생성할 때 상대 경로를 정의하시겠습니까? (0) | 2023.10.26 |
---|---|
MariaDB Galera 클러스터가 동기화되고 있지 않습니다. (0) | 2023.10.26 |
파일을 잠그는 응용 프로그램을 확인하는 PowerShell 스크립트? (0) | 2023.10.26 |
드롭 테이블도 제약 조건을 드롭합니까? (0) | 2023.10.26 |
중복된 기본 키에서 Pandas to_sql이 실패함 (0) | 2023.10.26 |