特定网站的基本NSURLSession使用情况

时间:2015-03-05 23:19:30

标签: ios swift post nsurlsession

我几乎不好意思问,但我正在尝试为自己构建一个小应用程序,而且我在网络技术的复杂性上磕磕绊绊。

不是我需要帮助的Swift,更多的是方法......

我试图以编程方式登录https://account.tfl.gov.uk/oyster

它只是英国网站,可让您检查旅行卡上的余额。

我厌倦了网络内容,但我相信我需要点击的POST网址是:https://oyster.tfl.gov.uk/oyster/security_check (从检查页面)

但是下面的代码只是保持返回200 OK,但是来自Web服务器的错误说该页面不可用。当然,该网站只是通过POST进行简单登录?

任何见解都会很棒 - 即使只是指向正确的方向! - 非常感谢...下面的当前方法:

func login() {

    var user = "myUsername"
    var pass = "myPassword"

    var config = NSURLSessionConfiguration.defaultSessionConfiguration()
    config.allowsCellularAccess = true


    var connection = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)

    var request = NSMutableURLRequest(URL: NSURL(string: "https://oyster.tfl.gov.uk/oyster/security_check")!)
    request.HTTPMethod = "POST"

    var params = "username=\(user)&password=\(pass)"

    var err: NSError?

    request.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)

    request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")


    connection.dataTaskWithRequest(request, completionHandler: {

        (data : NSData!, response : NSURLResponse!, error : NSError!) in


        var dataString = NSString(data: data, encoding: NSUTF8StringEncoding)


        println(response)
        println(dataString)



    }).resume()
}

2 个答案:

答案 0 :(得分:1)

查看登录页面的HTML,有几点意见:

  1. 您可能需要确认usernamepassword字段名称的大小写。有时Web服务区分大小写。

  2. 如果您查看HTML中的表单,表单上还有其他字段。您可能希望发送该登录表单中存在的所有字段(即使它们在Web浏览器中不可见)。

    虽然此处似乎不是这种情况,但有时这些字段是动态生成的,您实际上必须首先请求登录html页面,解析这些字段,并将它们包含在您的请求中。

  3. 您可能希望使用Charles等工具观看网络浏览器的互动。您可能希望尽可能忠实地重现请求。

  4. 建立请求正文时要小心。通常,值必须被转义百分比。例如,如果密码包含+&等保留字符,则此代码不起作用。在您的测试中可能不是这样,但需要注意的事项。

  5. 您可能希望查看此服务的服务条款,因为它们有时会禁止与其Web服务器进行编程交互。你不想违反他们的条款和条件。更重要的是,您不希望用户使用您的应用违反服务条款。

    您可能还想与网络服务器提供商联系,以了解他们是否拥有经过批准的API来执行您尝试执行的任务。

答案 1 :(得分:1)

在该网页上,POST需要一些额外的参数:这些都隐藏在HTML中。我认为你需要提供所有必需的参数才能让它发挥作用。

列表似乎是:

RETURNURL = “https://oyster.tfl.gov.uk/oyster/security_check”

的AppId = “8ead5cf4-4624-4389-b90c-b1fd1937bf1f”

用户名= “”

密码= “”

NB UserName和Password在名称中有大写字母。

尝试使用全部4并了解你的表现。没有花很多时间在这上面,所以可能错过了一些东西。

var params = "ReturnUrl=https://oyster.tfl.gov.uk/oyster/security_check&AppId=8ead5cf4-4624-4389-b90c-b1fd1937bf1f&UserName=\(user)&Password=\(pass)"

您可能会发现使用UIWebView更简单,并使用javascript填写表单并执行登录按钮。登录完成后,您可以使用javascript来删除您想要的任何数据。这样,您只需在其标准网页上自动执行用户交互。有了它,您还可以观看显示WebView时发生的情况。您还可以从WebView处理所有需要运行以使其工作的重定向,脚本等处理。

e.g。要设置用户名和密码并登录,您需要在WebView中的javascript中运行:

username=document.getElementById("UserName");
username.value="<put in your username>";
password=document.getElementById("Password");
password.value="<put in your password>";
signinbutton=document.getElementsByName("Sign in")[0];
signinbutton.click();

然后,它将处理WebView中登录的所有页面加载。

您可以使用Safari检查器窗口尝试所有这些。