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