2014-11-29 2 views
2

Мне нужно сделать почтовый запрос и получить ответ в Swift. Мне нужно добавить значения в запрос в формате пары ключ-значение, а затем получить ответ (0 или 1). Я не знаю, как добавить значения словаря в запрос .:Запрос POST в Swift с парами ключ-значение

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' [решение] (http://stackoverflow.com/a/27151324/1271826) невероятно элегантна и соблазнительна, если она предназначена только для iOS 8, но она не обрабатывает символ' + 'должным образом (т.е. если в пароле было '+', это не сработало бы должным образом). – Rob

+1

В каком формате должны отображаться данные при его отправке? JSON? Кодировка URL-адреса? @ Ответ Роба полезен, если кодировка URL-адреса закодирована, если JSON вы можете использовать 'NSJSONSerialization'. – pwightman

ответ

5

Решение. Благодаря @Rob:

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

Обновленный код для Swift 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: "&") 
} 
Смежные вопросы