2015-01-13 78 views
0

我寫了一些代碼,然後返回登錄到用戶輸入憑據的網站,然後導航到某個頁面以解析信息(使用NSURLConnectionDelegate)。Swift/iOS8順序HTTP請求

func startConnection() { 
    var url = NSURL(string:"https://www.website.com/psp/ps/?cmd=login&languageCd=ENG") 
    var request = NSMutableURLRequest(URL: url!) 
    request.HTTPMethod = "POST" 

    let data = (dataString as NSString).dataUsingEncoding(NSUTF8StringEncoding) 

    request.HTTPBody = data 

    request.setValue("\(data!.length)", forHTTPHeaderField: "Content-Length") 
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
    request.setValue("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", forHTTPHeaderField: "Accept") 

    connection1 = NSURLConnection(request: request, delegate: self, startImmediately: false)! 

    connection1.start() 
} 

func connectionDidFinishLoading(connection: NSURLConnection) { 

    if (connection == connection1) { 
     let url = NSURL(string: "https://www.nexturl.com") 
     var request = NSMutableURLRequest(URL: url!) 
     connection2 = NSURLConnection(request: request, delegate: self, startImmediately: false)! 
     connection2.start() 

    } 

    if (connection == connection2) { 

     let url = NSURL(string: "https://www.nexturl.com") 
     var request = NSMutableURLRequest(URL: url!) 
     connection3 = NSURLConnection(request: request, delegate: self, startImmediately: false)! 
     connection3.start() 
    } 

    if (connection == connection3) { 
     let strData: NSString = NSString(data: responseData, encoding: NSUTF8StringEncoding)! 
     parse(strData) 


    } 

} 

總的想法是斷火的初始請求,然後從委託方法connectionDidFinishLoading發送關閉其他請求。有沒有更清潔/更好的方式來進行這種順序呼叫?

+1

使用框架如AFNetworking從應用程序邏輯分離的HTTP請求的邏輯,給你一個簡單的塊回調請求結束時。然後,您可以通過在嵌套完成塊中發出新請求來鏈接請求。 –

+0

是的@David說,最好的方法是使用基於閉包的HTTP框架。因爲在快速,功能封閉鏈將是非常乾淨。 在這種情況下,代表明確不是解決方案。 你爲什麼要連續呼叫? 您需要重複使用來自第一次請求的數據? 如果不是,你可以只做平行請求? – LastMove

+0

以及我真正需要的是驗證登錄。我正在研究alamofire,新的聯網。謝謝你的迴應。 – chris

回答

2

所以,我做它用Alamofire框架(AFNetworking的新版本):

var loginRequest = NSMutableURLRequest(URL: NSURL(string:"login.com")!) 
    loginRequest.HTTPMethod = "POST" 

    loginRequest.HTTPBody = ("timezoneOffset=-600&userid1=\(username)&userid=\(username.capitalizedString)&pwd=\(pass)&x=31&y=12" as NSString).dataUsingEncoding(NSUTF8StringEncoding) 

    let manager = Alamofire.Manager.sharedInstance 

    // Chain requests 
    manager.request(loginRequest) 
     .responseString{ (request, response, string, error) in 
      if response!.statusCode == 500 { 
       return Error.InternalServerError 
      } 
      else { 

      manager.request(.GET, "www.redirect.com") 
       .responseString { (request, response, string, error) in 
        println(string) 
      } 
     } 
    }