ios - 如何使用 POST 请求登录网站? ( swift ,iOS)

标签 ios swift post http-headers alamofire

我想创建一个登录 website 的 iOS 应用程序并从该站点的多个页面解析数据,同时维护登录 session 。这就是我到目前为止所做的。我发送 GET 请求以检索 POST 请求所需的 EVENTVALIDATON 和 VIEWSTATE 参数。 (我使用“Firebug”查看了 POST)。当我运行以下代码时,它会返回相同的登录页面。但它应该给我 this page .

    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)
    }

老实说,我对请求和解析数据很陌生(虽然我已经单独完成了解析部分)。我做了更多研究并阅读了有关 header 和 cookie 的信息。因此在检查 header 后,浏览器的初始 GET 请求的响应 header 为

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-Powered-By :   ASP.NET

的请求头
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`

问题是我不明白最初的 GET 请求怎么会有一个 token 。如果请求先发生,响应应该是包含 token 的响应?我不知道我做错了什么以及如何让它工作。我不知道我是否完全遗漏了一些东西。我是在尝试了我能想到的一切之后才来到这里的。任何帮助,将不胜感激。谢谢。

最佳答案

POST 所需的 EVENTVALIDATON 和 VIEWSTATE 参数 <--

但是在你的代码中POST请求是在GET请求之后立即执行的,此时self.parameter为空

Alamofire 具有异步 completionHandler

等待GET请求完成,然后发送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)
    }

}

关于ios - 如何使用 POST 请求登录网站? ( swift ,iOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44616118/

相关文章:

iphone - 以编程方式加载 View Controller 的 Outlet View

ios - Xcode 中未显示 TestFlight 崩溃日志?

javascript - 下载 JS 文件并使用 NativeScript 作为后台服务运行

PHP更新数据库

r - httr POST 身份验证错误

iOS [Obj-C] - 滚动时导航栏透明且项目可见

swift - 如何使用 SpriteKit swift 重新着色 Sprite

ios - 通过按下按钮(Swift)打开具有特定位置的天气应用程序

ios - 'pod init' 为 'pod lib create ...' 创建了 pod?

internet-explorer - Jquery post 无法在 IE 8 或更早版本中工作