2016-04-03 44 views
0

我试图从存储我所有成绩的网站上拉我的学校成绩,但我在使用HTTP请求登录时遇到问题,并且拉下了下一页的信息。任何帮助表示赞赏:)如何取得网站上的成绩,并使用POST请求执行登录?

override func viewDidLoad() { 
    super.viewDidLoad() 

    let myUrl = NSURL(string: "https://homeaccess.katyisd.org/HomeAccess/Account/LogOn?ReturnUrl=%2fhomeaccess%2f") 
    let request = NSMutableURLRequest(URL: myUrl!) 
    request.HTTPMethod = "POST" 
    let postString = "User_Name=**hidden**&Password=**hidden**" 
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ 
     data,response,error in 
     if(error != nil){ 
      print("error=\(error)") 
      return 
     } 

     print("response = \(response)") 

     // Print out response body 
     let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("responseString = \(responseString)") 

     //Let’s convert response sent from a server side script to a NSDictionary object: 

     do{ 
     var myJSON = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary 

     if let parseJSON = myJSON { 
      // Now we can access value of First Name by its key 
      var firstNameValue = parseJSON["User_Name"] as? String 
      print("firstNameValue: \(firstNameValue)") 
     } 


     }catch{ 
      print(error) 
     } 
    } 

} 
+0

如果没有登录数据,很难判断出现什么问题......是不是有什么问题?你会得到什么错误?发生了什么问题?你到底有什么问题? –

+0

没有打印在控制台内 – user6032625

+0

没问题。这是有道理的,因为你根本没有触发请求。在代码末尾添加'task.resume()'... –

回答

-1

在代码的末尾添加task.resume()。还有以下添加到您的info.plist文件:

info.plist

+0

I得到这个错误http://puu.sh/o551X/87214a65bf.png – user6032625

+0

是啊,看起来像你不能让你的尝试后的请求。我得到一个状态500(内部服务器错误)... –

+0

任何替代品? – user6032625

0
  1. 首先,你需要task.resume(),以启动连接负载定义任务后,否则对象将被创建并没有什么会真正发生。根据this error you posted,您尝试访问的网站上存在SSL验证错误。最安全的选择是修复网站上的SSL,但我认为在这种情况下超出了您的控制范围。正如@安德烈所建议的,更简单的解决方法是通过在您的info.plist中添加"App Transport Security Settings" > "Allow Arbitrary Loads" = YES来绕过SSL错误。或者,如果您仅使用一个域,则绕过NSExceptionDomains中的特定域。有关更多信息,请参阅this question

  2. 根据this error you posted,发生JSON解析错误。它目前正在被catch块捕获并打印,所以数据实际上没有处理。在你的情况下,这是因为Home Access Center的响应是HTML而不是JSON,因此JSON解析器失败。您可能正在寻找一个HTML解析器。 Swift没有内置的;查看this question,了解一些开源选项的示例。

我实际上已经创建了一个与Home Access Center接口的程序。可悲的是,没有公共API可用 - API通常返回JSON,这更容易处理。相反,您需要使用HTML解析器来分析用于人类用户和Cookie的页面,以伪造人类用户正在登录。

+1

#2 - 不要对Info.plist进行更改。允许所有任意负载修复一个特定问题是不合适的。 – rmaddy

+0

@rmaddy真的,我修改了答案,指出它不是最好的方法,但最简单的方法。我也假设他无法访问域本身并从源头解决SSL问题。 – BradzTech