2014-11-29 3 views
2

게시 요청을하고 Swift에서 응답을 받아야합니다. 요청에 키 - 값 쌍 형식으로 값을 추가해야합니다. 그런 다음 응답을 얻습니다 (0 또는 1). 요청에 사전 값을 추가하는 방법을 모르겠습니다. :키 - 값 쌍이있는 Swift의 POST 요청

var url = NSURL(string:"www.myurl.com") 
    var request = NSMutableURLRequest(URL: url!) 
    request.HTTPMethod = "POST" 
    var params = ["email":"\(txtEmail.text)", "passw":"\(txtPassword.text)"] as Dictionary 
    let data = //HOW CAN I LOAD THE DATA TO THE HTTPBODY REQUEST?? 
    request.HTTPBody = data 
    var connection = NSURLConnection(request: request, delegate: self, startImmediately: false) 

미리 감사드립니다.

+1

http://stackoverflow.com/a/25154803/1271826을 참조하십시오. 나는이 대안 NSURLQueryItem [solution] (http://stackoverflow.com/a/27151324/1271826)이 iOS 8만을 대상으로한다면 엄청나게 우아하고 매력적이지만'+'문자를 제대로 처리하지 못한다고 (ie if 패스워드에'+'가 있었다면 제대로 작동하지 않을 것입니다). – Rob

+1

데이터를 보낼 때 어떤 형식이어야합니까? JSON? URL 형식이 인코딩 되었습니까? @ Rob의 답변은 JSON이 NSJSONSerialization을 사용할 수있는 경우 URL 형식이 인코딩 된 경우 유용합니다. – pwightman

답변

5

용액. 덕분에 @ 롭하기 :

func loginRequest(url:String, withParams params: [String: String?], postCompleted : (succeeded: Bool, msg: String) ->()){ 
    var request = NSMutableURLRequest(URL: NSURL(string: url)!) 
    var session = NSURLSession.sharedSession() 
    request.HTTPMethod = "POST" 

    var err: NSError? 
    var bodyData = "" 
    for (key,value) in params{ 
     if (value == nil){ continue } 
     let scapedKey = key.stringByAddingPercentEncodingWithAllowedCharacters(
      .URLHostAllowedCharacterSet())! 
     let scapedValue = value!.stringByAddingPercentEncodingWithAllowedCharacters(
      .URLHostAllowedCharacterSet())! 
     bodyData += "\(scapedKey)=\(scapedValue)&" 
    } 

    request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 

    var task = session.dataTaskWithRequest(request, 
     completionHandler: {data, response, error -> Void in 
      let dataString = NSString(data: data, encoding: NSUTF8StringEncoding) 
      postCompleted(succeeded: true, msg: dataString!) 
    }) 
    task.resume() 
} 

가 그럼,이 함수를 호출하고 사용자가 맞다면 내가 알 수 :

 self.loginRequest("http:myurl.com", 
      withParams: ["email":"email","passw":"passw"]) 
     { 
      (succeeded: Bool, msg: String) ->() in 
      if(succeeded) { 
       if msg == "0" 
       { 
        //Incorrect data... 
       } 
       else 
       { 
        //The login it's ok... 
       } 
      } 
     } 
+0

우수한 작업! –

1

는 스위프트 4 + 작은 개선을 위해 코드를 업데이트했습니다. @imj 작업을 기반으로합니다.

/// Converts the dictionary to key values 
func convertToParameters(_ params: [String: String?]) -> String { 
    var paramList: [String] = [] 

    for (key, value) in params { 
     guard let value = value else { 
      continue 
     } 

     guard let scapedKey = key.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else { 
      print("Failed to convert key \(key)") 
      continue 
     } 

     guard let scapedValue = value.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else { 
      print("Failed to convert value \(value)") 
      continue 
     } 

     paramList.append("\(scapedKey)=\(scapedValue)") 
    } 

    return paramList.joined(separator: "&") 
} 
관련 문제