2015-01-13 79 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) 
      } 
     } 
    }