【问题标题】:Python post request equivalent in SwiftSwift 中的 Python 发布请求等价物
【发布时间】:2016-03-15 08:49:15
【问题描述】:

我有一个用 python 编写的小脚本并且工作正常,所以我想在我的 swift 应用程序中实现相同的东西,但找不到方法

这是我的python代码:

payload = {'login': 'Submit', 'username': 'username', 'password': 'password', 'redirect': 'iph.php'}
with session() as c:
    c.post('http://mywebsite.com/iph.php', data=payload)
    response = c.get('http://mywebsite.com/mobile.php?page=profile')
    tree = html.fromstring(response.content)
    males = tree.xpath('//td[@id="someinfo"]/text()')
    females = tree.xpath('//td[@id="someinfo2"]/text()')
    print(response.headers)
    print(response.text)

所以基本上我从脚本中收到 2 个文本信息(someinfo 和 someinfo2),在 swift 应用程序中我需要将它们打印在标签上。

谢谢

【问题讨论】:

  • 想到的两种方法。 NSSession 和 NSStream;调查,尝试一些事情,如果需要更多帮助,请回来?

标签: python swift http http-post


【解决方案1】:

使用第三方框架,如 Alamofire:

let payload = ["login": "Submit", "username": "username", "password": "password", "redirect": "iph.php"]

Alamofire.request(.POST, "http://mywebsite.com/iph.php", parameters: payload)
    .response { request, response, data, error in
        guard let data = data else {
            fatalError("No data returned")
        }
        do {
            let html = try NSXMLDocument(data: data, options: NSXMLDocumentTidyHTML)
            let root = html.rootElement()!
            let males = try root.nodesForXPath("//td[@id='someinfo']/text()")
            let females = try root.nodesForXPath("//td[@id='someinfo2']/text()")
        } catch let error as NSError {
            print(error.localizedDescription)
        }
    }

仅使用 Foundation(即 Apple 提供的)类:

let payload = ["login": "Submit", "username": "username", "password": "password", "redirect": "iph.php"]
let request = NSMutableURLRequest(URL: NSURL(string: "http://mywebsite.com/iph.php")!)
request.HTTPMethod = "POST"
request.HTTPBody = NSKeyedArchiver.archivedDataWithRootObject(payload)

let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: config)
let task = session.dataTaskWithRequest(request) { data, response, error in
    guard let data = data else {
        fatalError("No data returned")
    }
    do {
        let html = try NSXMLDocument(data: data, options: NSXMLDocumentTidyHTML)
        let root = html.rootElement()!
        let males = try root.nodesForXPath("//td[@id='someinfo']/text()")
        let females = try root.nodesForXPath("//td[@id='someinfo2']/text()")
    } catch let error as NSError {
        print(error.localizedDescription)
    }
}

task.resume()

注意事项

  • 由于您的请求是通过不安全的 HTTP 传输的,您可能需要设置 App Transport Security 以允许它。
  • 您不能在控制台应用程序或 Playground 中使用 Alamofire。
  • 两种方法都异步执行。在等待响应时,您必须保持主队列继续运行。在 GUI 应用程序中,运行循环将使您的应用程序继续运行,所以这不是问题。对于控制台应用程序,您可以通过调用 sleep(secs) 暂停主队列或使用 Grand Central Dispatch 等待请求。

【讨论】:

  • 感谢您的回复。这对我来说很有意义,但我无法导入 NSXMLDocument 我的意思是错误是:使用未解析的标识符“NSXMLDocument”
  • import Foundation 添加到您的来源
  • 您是在 Mac 还是 Linux 上执行此操作?
  • 我正在使用 os x 10.11.3 和 xCode 7.2.1 和 iOS 9 开发
  • 我以为你一直在使用 OS X! NSXMLDocument 在 iOS 中不可用。使用第三方类,如Hpple
猜你喜欢
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多