¿Cómo iniciar session en un sitio usando la request POST? (Swift, iOS)

Quiero crear una aplicación de iOS que inicie session en un website y analice los datos de varias páginas de ese sitio, manteniendo la session de inicio de session. Esto es lo que he hecho hasta ahora. Envío una request GET para recuperar los parameters EVENTVALIDATON y VIEWSTATE necesarios para la request POST. (Miré el POST usando 'Firebug'). Cuando ejecuto el siguiente código, devuelve la misma página de inicio de session. Pero debería estar dándome esta página .

var parameter: Parameters = [:] var viewstate: String = "" var eventvalidation: String = @IBAction func postRequest(_ sender: Any) { Alamofire.request("https://ecampus.psgtech.ac.in/studzone/AttWfLoginPage.aspx").responseString { response in print("\(response.result.isSuccess)") if let html = response.result.value { if let doc = Kanna.HTML(html: html, encoding: String.Encoding.utf8) { // Search for nodes by CSS selector for show in doc.css("input[id='__VIEWSTATE']") { self.viewstate=show["value"]! //print(show["value"] as Any) } for show in doc.css("input[id='__EVENTVALIDATION']") { self.eventvalidation=show["value"]! //print(show["value"] as Any) } } } //creating dictionary for parameters self.parameter = ["__EVENTTARGET":"", "__EVENTARGUMENT":"", "__LASTFOCUS":"", "__VIEWSTATE":self.viewstate, "__EVENTVALIDATION":self.eventvalidation, "rdolst":"S", "Txtstudid":"<myrollno>", "TxtPasswd":"<mypassword>", "btnlogin":"Login" ] } Alamofire.request ("https://ecampus.psgtech.ac.in/studzone/AttWfLoginPage.aspx",method: .post, parameters: self.parameter, headers: headers).responseString { response in print("\(response.result.isSuccess)") print(response) } 

Para ser honesto, soy muy nuevo en las requestes y en el análisis de datos (aunque he terminado la parte de análisis por separado). Hice un poco más de investigación y leí acerca de los encabezados y las cookies. Luego de comprobar los encabezados, la request GET inicial del browser tiene un encabezado de respuesta de

 Cache-Control : private Content-Encoding : gzip Content-Length : 4992 Content-Type : text/html; charset=utf-8 Date : Sun, 18 Jun 2017 14:25:50 GMT Server : Microsoft-IIS/8.0 Set-Cookie : .ASPXAUTH=; expires=Mon, 11-Oct-1999 18:30:00 GMT; path=/; HttpOnly Vary : Accept-Encoding X-AspNet-Version : 4.0.30319 X-Powenetworking-By : ASP.NET 

y encabezado de request de

 Accept : text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8 Accept-Encoding : gzip, deflate, br Accept-Language : en-US,en;q=0.5 Connection : keep-alive Cookie : ASP.NET_SessionId=urzugt0zliwkmz3ab1fxx1ja Host : ecampus.psgtech.ac.in Upgrade-Insecure-Requests : 1 User-Agent : Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:54.0) Gecko/20100101 Firefox/54.0` 

El problema es que no entiendo cómo una request GET inicial puede tener un token con él. Si la request ocurre primero, la respuesta debe ser la que contiene el token. No sé qué estoy haciendo mal y cómo hacer que esto funcione. No sé si me estoy perdiendo algo por completo. Vine aquí solo después de probar todo en lo que podía pensar. Cualquier ayuda sería apreciada. Gracias.

EVENTVALIDATON y VIEWSTATE parameters necesarios para el POST <-

Pero en su código, la request POST se ejecuta inmediatamente después de la request GET, en este punto el parámetro self.parameter está vacío

Alamofire tiene completado asynchronous Handler

Espere a que se complete la request GET y luego envíe la request POST:

 var parameter: Parameters = [:] var viewstate: String = "" var eventvalidation: String = @IBAction func postRequest(_ sender: Any) { Alamofire.request("https://ecampus.psgtech.ac.in/studzone/AttWfLoginPage.aspx").responseString { response in print("\(response.result.isSuccess)") if let html = response.result.value { if let doc = Kanna.HTML(html: html, encoding: String.Encoding.utf8) { // Search for nodes by CSS selector for show in doc.css("input[id='__VIEWSTATE']") { self.viewstate=show["value"]! //print(show["value"] as Any) } for show in doc.css("input[id='__EVENTVALIDATION']") { self.eventvalidation=show["value"]! //print(show["value"] as Any) } } } //creating dictionary for parameters self.parameter = ["__EVENTTARGET":"", "__EVENTARGUMENT":"", "__LASTFOCUS":"", "__VIEWSTATE":self.viewstate, "__EVENTVALIDATION":self.eventvalidation, "rdolst":"S", "Txtstudid":"15i231", "TxtPasswd":"OpenSesame", "btnlogin":"Login" ] //Wait for the GET request to complete, and then send the POST request: <<== Alamofire.request ("https://ecampus.psgtech.ac.in/studzone/AttWfLoginPage.aspx",method: .post, parameters: self.parameter, headers: headers).responseString { response in print("\(response.result.isSuccess)") print(response) } }