2015-06-24 25 views
16

Burada yeni yaşıyorum ve bu benim ilk sorum ... Bir HTTP POST isteği yapan bir Uygulama yazmayı deneyin ama nasıl yapılacağını anlayamıyorum Swift 2'nin yeni hata işlemesini kullanın. Herkes, "2 do-try-catch" hata kodunun aşağıdaki kod snippet'ini nasıl işleyeceğini lütfen bana söyleyebilir mi? GeneldeHTTP POST hatası Swift 2'de işlem yapma

func post(params : Dictionary<String, String>, url : String) { 
    var request = NSMutableURLRequest(URL: NSURL(string: url)!) 
    var session = NSURLSession.sharedSession() 
    request.HTTPMethod = "POST" 

    var err: NSError? 
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil/*, error: &err*/) 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     print("Response: \(response)") 
     var strData = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("Body: \(strData)") 
     var err: NSError? 
     var json = NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves/*, error: &err*/) as? NSDictionary 

     // Did the JSONObjectWithData constructor return an error? If so, log the error to the console 
     if(err != nil) { 
      print(err!.localizedDescription) 
      let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("Error could not parse JSON: '\(jsonStr)'") 
     } 
     else { 
      // The JSONObjectWithData constructor didn't return an error. But, we should still 
      // check and make sure that json has a value using optional binding. 
      if let parseJSON = json { 
       // Okay, the parsedJSON is here, let's get the value for 'success' out of it 
       var success = parseJSON["success"] as? Int 
       print("Succes: \(success)") 
      } 
      else { 
       // Woa, okay the json object was nil, something went worng. Maybe the server isn't running? 
       let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
       print("Error could not parse JSON: \(jsonStr)") 
      } 
     } 
    }) 

    task!.resume() 
} 

cevap

36

Muhtemelen çağrılarınızı aşağıda gösterildiği gibi do/try/catch mantığına sarmak istersiniz.

Swift 3'te

: Eğer/kolu algılamak istiyorum, çünkü

var request = URLRequest(url: URL(string: urlString)!) 

let session = URLSession.shared 
request.httpMethod = "POST" 
request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.addValue("application/json", forHTTPHeaderField: "Accept") 

request.httpBody = try! JSONSerialization.data(withJSONObject: parameters) 

// or if you think the conversion might actually fail (which is unlikely if you built `parameters` yourself) 
// 
// do { 
// request.httpBody = try JSONSerialization.data(withJSONObject: parameters) 
// } catch { 
// print(error) 
// } 

let task = session.dataTask(with: request) { data, response, error in 
    guard let data = data, error == nil else { 
     print("error: \(error)") 
     return 
    } 

    // this, on the other hand, can quite easily fail if there's a server error, so you definitely 
    // want to wrap this in `do`-`try`-`catch`: 

    do { 
     if let json = try JSONSerialization.jsonObject(with: data) as? [String: Any] { 
      let success = json["success"] as? Int         // Okay, the `json` is here, let's get the value for 'success' out of it 
      print("Success: \(success)") 
     } else { 
      let jsonStr = String(data: data, encoding: .utf8) // No error thrown, but not dictionary 
      print("Error could not parse JSON: \(jsonStr)") 
     } 
    } catch let parseError { 
     print(parseError)               // Log the error thrown by `JSONObjectWithData` 
     let jsonStr = String(data: data, encoding: .utf8) 
     print("Error could not parse JSON: '\(jsonStr)'") 
    } 
} 

task.resume() 

Veya,

let request = NSMutableURLRequest(URL: NSURL(string: urlString)!) 

let session = NSURLSession.sharedSession() 
request.HTTPMethod = "POST" 
request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.addValue("application/json", forHTTPHeaderField: "Accept") 

request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(parameters, options: []) 

// or if you think the conversion might actually fail (which is unlikely if you built `parameters` yourself) 
// 
// do { 
// request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: []) 
// } catch { 
// print(error) 
// } 

let task = session.dataTaskWithRequest(request) { data, response, error in 
    guard let data = data where error == nil else { 
     print("error: \(error)") 
     return 
    } 

    // this, on the other hand, can quite easily fail if there's a server error, so you definitely 
    // want to wrap this in `do`-`try`-`catch`: 

    do { 
     if let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary { 
      let success = json["success"] as? Int         // Okay, the `json` is here, let's get the value for 'success' out of it 
      print("Success: \(success)") 
     } else { 
      let jsonStr = String(data: data, encoding: NSUTF8StringEncoding) // No error thrown, but not NSDictionary 
      print("Error could not parse JSON: \(jsonStr)") 
     } 
    } catch let parseError { 
     print(parseError)               // Log the error thrown by `JSONObjectWithData` 
     let jsonStr = String(data: data, encoding: NSUTF8StringEncoding) 
     print("Error could not parse JSON: '\(jsonStr)'") 
    } 
} 

task.resume() 

Swift 2'de Ben de data ait unwrapping zorla konusunda biraz daha dikkatli olmak öneririm hatalar, çökme değil. Örneğin, ben onu açmak için bir guard ifadesini kullanıyorum.

6

(Bu kod parçacığı hızlı 1.2 eski hata işleme kullanır) eğer bir işlev throws Bir do catch bloğunun içinde yazmak zorunda ya da sadece (bu durumda post olarak) dış kapsam işlevini işaretlemek olarak throws: doğruca post fonksiyonundaki bu hataları işlemek istemiyorsanız tüm

de do catch kullanmak gerekmez daha

func post(params : Dictionary<String, String>, url : String) { 
    let request = NSMutableURLRequest(URL: NSURL(string: url)!) 
    let session = NSURLSession.sharedSession() 
    request.HTTPMethod = "POST" 

    do { 
     request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: .PrettyPrinted) 
    } catch { 
     //handle error. Probably return or mark function as throws 
     print(error) 
     return 
    } 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 

    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
     // handle error 
     guard error == nil else { return } 

     print("Response: \(response)") 
     let strData = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("Body: \(strData)") 

     let json: NSDictionary? 
     do { 
      json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary 
     } catch let dataError { 
      // Did the JSONObjectWithData constructor return an error? If so, log the error to the console 
      print(dataError) 
      let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("Error could not parse JSON: '\(jsonStr)'") 
      // return or throw? 
      return 
     } 


     // The JSONObjectWithData constructor didn't return an error. But, we should still 
     // check and make sure that json has a value using optional binding. 
     if let parseJSON = json { 
      // Okay, the parsedJSON is here, let's get the value for 'success' out of it 
      let success = parseJSON["success"] as? Int 
      print("Succes: \(success)") 
     } 
     else { 
      // Woa, okay the json object was nil, something went worng. Maybe the server isn't running? 
      let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("Error could not parse JSON: \(jsonStr)") 
     } 

    }) 

    task!.resume() 
} 

sadece throws olarak ilan edebilir

+0

Çalışıyor! Bu hızlı cevap için teşekkürler –

+0

Rob, halim haklısın :) – Qbyte