我几乎不好意思问,但我正在尝试为自己构建一个小应用程序,而且我在网络技术的复杂性上磕磕绊绊。
不是我需要帮助的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()
}
答案 0 :(得分:1)
查看登录页面的HTML,有几点意见:
您可能需要确认username
和password
字段名称的大小写。有时Web服务区分大小写。
如果您查看HTML中的表单,表单上还有其他字段。您可能希望发送该登录表单中存在的所有字段(即使它们在Web浏览器中不可见)。
虽然此处似乎不是这种情况,但有时这些字段是动态生成的,您实际上必须首先请求登录html页面,解析这些字段,并将它们包含在您的请求中。
您可能希望使用Charles等工具观看网络浏览器的互动。您可能希望尽可能忠实地重现请求。
建立请求正文时要小心。通常,值必须被转义百分比。例如,如果密码包含+
或&
等保留字符,则此代码不起作用。在您的测试中可能不是这样,但需要注意的事项。
您可能希望查看此服务的服务条款,因为它们有时会禁止与其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检查器窗口尝试所有这些。