Javascript Swift 3-如何从URL数据请求提交HTTP表单

Javascript Swift 3-如何从URL数据请求提交HTTP表单,javascript,html,ios,swift3,httpwebrequest,Javascript,Html,Ios,Swift3,Httpwebrequest,我现在有点困惑,不知该怎么办。到目前为止,我已经连接到我想要提交登录表单的网站。当我访问该站点时,需要用户名和密码,然后您可以登录该站点的登录版本。该站点的源代码包含用于输入文本的占位符。占位符的字符串存储为变量。我假设我需要在返回的http数据中搜索它。登录页面中的数据成功返回,打印输出包含这些占位符。我通过文本字段从用户处获得用户名和密码,但我如何告诉网站“插入”这些用户值作为网站字段,并提交表单(基本上按“登录”),以便访问网站的登录版本?当我查看正在使用的网站的源代码时,代码是用Java

我现在有点困惑,不知该怎么办。到目前为止,我已经连接到我想要提交登录表单的网站。当我访问该站点时,需要用户名和密码,然后您可以登录该站点的登录版本。该站点的源代码包含用于输入文本的占位符。占位符的字符串存储为变量。我假设我需要在返回的http数据中搜索它。登录页面中的数据成功返回,打印输出包含这些占位符。我通过文本字段从用户处获得用户名和密码,但我如何告诉网站“插入”这些用户值作为网站字段,并提交表单(基本上按“登录”),以便访问网站的登录版本?当我查看正在使用的网站的源代码时,代码是用JavaScript编写的。这需要jQuery或JSON解析(GET/POST请求),还是我尝试了错误的事情

import UIKit

class ViewController: UIViewController {
    final var USERNAME_FIELD = "ctl00$ContentPlaceHolder$Username"
    final var PASSWORD_FIELD = "ctl00$ContentPlaceHolder$Password"

    @IBOutlet weak var gobuttom: UIButton!

    @IBOutlet weak var passField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        gobuttom.isEnabled = true

        data_request("https://example.com")


    }


    func data_request(_ url:String)
    {
        let url:NSURL = NSURL(string: url)!
        let session = URLSession.shared

        let request = NSMutableURLRequest(url: url as URL)
        request.httpMethod = "POST"

        let paramString = "data=test"
        request.httpBody = paramString.data(using: String.Encoding.utf8)

        let task = session.dataTask(with: request as URLRequest) {
            (
            data, response, error) in

            guard let _:NSData = data as NSData?, let _:URLResponse = response, error == nil else {
                print("error")
                return
            }

            if let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
            {
                print(dataString)
            }
        }

        task.resume()

    }



    @IBOutlet weak var usernameField: UITextField!

    @IBAction func usernameChanged(_ sender: Any) {
        print("textfield : \(String(describing: usernameField.text))")

        gobuttom.isEnabled = true
    }



    @IBAction func goPressed(_ sender: Any) {

        if(usernameField.text != "" && passField.text != ""){
            print("OK")
        }

    }
}

Swift中的Http废弃相当复杂。除非您定期进行web开发,否则没有太多关于如何做的信息。这里有一个关于快速刮取的很好的教程:

这基本上是正确的(尽管您可以将
内容类型
标题设置为
application/x-www-form-urlencoded
)。问题是,当您试图刮取一个站点并复制登录过程时,登录页面中通常会有隐藏字段,其中包括动态创建的会话标识符标记等。因此,您通常无法绕过登录页面,而是必须首先请求,捕获隐藏字段,然后将它们包含在上面显示的实际登录请求中。仅供参考,现在我们避免使用
NSMutableURLRequest
,而是使用
var request=URLRequest(…)
。同样,您将使用
Data
String
而不是
NSData
NSString
。它的工作方式与您的方式相同,但我们通常会尽可能使用Swift类型。它只会导致更快速、更容易阅读的代码,并避免了许多不必要的强制转换。@Rob那么下一步是什么来查找这些隐藏字段呢?显然,如果我转到源代码,我可以找到这些事件的关键字“hidden”,但我是否需要一个特定的资产,如jQuery或Alamofire来继续?是的,您请求登录页面,解析HTML以查找这些隐藏字段,捕获这些值,并在实际登录的第二个请求中使用它们。(你不必总是这样做,但根据我的经验,你通常是这样做的。)也可以有cookies,即使你在那里没有看到任何隐藏字段,因此你可能必须在尝试登录之前执行登录页面请求。有时,通过浏览器的“开发人员”工具之类的工具观察基于web的登录过程是很有用的(虽然您应该看到是否有任何AJAX调用来回进行,或者JavaScript中是否有任何复杂的事情需要复制;这是不太可能的)。在提交请求时,Alamofire是一个非常好的工具,可以帮助您摆脱编写第二个“使用此用户名/密码登录”的麻烦请求。发出
x-www-form-urlencoded
请求可能很复杂(例如
httpBody
中值的百分比编码),Alamofire为您简化了一点。刮取仍然非常复杂,但Alamofire有帮助。