对于屏幕抓取项目,我在Swift中使用NSURLSession来读取HTML页面。但是已经开始失败,因为返回的页面提供了重定向到新网页,而我的代码不遵循这一点。如果没有为会话设置委托,我认为默认情况下重定向会起作用。但两种情况都没有重定向。这是我的测试项目:
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, NSURLSessionTaskDelegate {
@IBOutlet weak var window: NSWindow!
func URLSession(session: NSURLSession, task: NSURLSessionTask, willPerformHTTPRedirection response: NSHTTPURLResponse,
newRequest request: NSURLRequest, completionHandler: (NSURLRequest!) -> Void) {
completionHandler(request);
}
func applicationDidFinishLaunching(aNotification: NSNotification) {
var url = NSURL(string: "https://banking.dkb.de");
let defaultConfigObject = NSURLSessionConfiguration.defaultSessionConfiguration();
let session = NSURLSession(configuration: defaultConfigObject, delegate: self, delegateQueue: nil);
let task = session.dataTaskWithURL(url!, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
let text = NSString(data: data, encoding: NSUTF8StringEncoding);
// text contains here: <head><meta HTTP-EQUIV="REFRESH" content="0; url=/dkb/"></head>
if var document = NSXMLDocument(data: data, options: Int(NSXMLDocumentTidyHTML), error: nil) {
if let forms = document.nodesForXPath("//form[@name='login']", error: nil) where forms.count > 0 {
let form = forms[0] as! NSXMLNode;
}
}
});
task.resume();
}
func applicationWillTerminate(aNotification: NSNotification) {
// Insert code here to tear down your application
}
}
我需要做些什么来重定向?
更新
在进一步调查中,我发现它必须与服务器的结果有关。例如,使用https://www.google.com
确实会触发重定向委托。但是,由于任何浏览器都可以处理来自银行地址的重定向,因此必须采用不同的方法来正确处理,并且我想了解如何。
答案 0 :(得分:2)
NSURLSession支持302重定向,https://www.google.com使用它。
另一方面,https://banking.dkb.de/使用了所描述的元标记。它返回200(OK)作为状态代码,因此您必须处理它以读取元标记。