Swift3提交POST表单POST登录后

时间:2017-05-11 00:59:42

标签: ios python-3.x post swift3

我一直在尝试制作一个简单的应用程序来打开我工作中的RFID门。这是一个非常简单的网站,一个POST登录(使用用户名和密码),然后是另一个提交打开门的POST表单。所以我在Python3中创建了一个完美的脚本:

import requests
import collections

payload = collections.OrderedDict()
payload['username'] = 'admin'
payload['pwd'] = 'password'
payload['logId'] = '20101222'  

payload2 = collections.OrderedDict()
payload2['UNCLOSE1'] = 'Remote Open #1 Door Front Door'

payload3 = collections.OrderedDict()
payload3['s6'] = 'Exit'

with requests.Session() as s:
    p = s.post('http://192.168.99.25/ACT_ID_1', data=payload)
    print(p.text)
    print()

    r = s.post('http://192.168.99.25/ACT_ID_701', data=payload2)
    print(r.text)
    print()

    r2 = s.post('http://192.168.99.25/ACT_ID_21', data=payload3)
    print(r2.text)

那就是我在Python3中的代码,现在我一直在尝试将其移植到swift3(在应用程序中对我来说会更容易,除非有一种可接受的方式来运行python文件)

我一直在使用URLSession,但我还没有使用它的经验。如果你想要我一直试图使用的代码,我可以发布它,但它很垃圾。

谢谢,-Asher

编辑:

我一直在尝试的代码:

func connectToRFID(_ session: URLSession) {

    let addressOne = URL(string: "http://192.168.99.25/ACT_ID_1")!
    let postOne = "username=admin&pwd=password&logId=20101222"

    var request = URLRequest(url: addressOne)


    request.httpMethod = "POST"
    request.httpBody = postOne.data(using: .utf8)
    let task = session.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {                                                 // check for fundamental networking error
            print("error = \(String(describing: error))")
            return
        }

        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(String(describing: response))")
        }

        let responseString = String(data: data, encoding: .utf8)
        print("responseString = \(String(describing: responseString))")
        print()
    }
    task.resume()

func openRFID(_ session: URLSession) {
    let addressTwo = URL(string: "http://192.168.99.25/ACT_ID_701")!
    let postTwo = "UNCLOSE1=Remote Open #1 Door Front Door"
    var request2 = URLRequest(url: addressTwo)

    request2.httpMethod = "POST"
    request2.httpBody = postTwo.data(using: .utf8)

    let task2 = session.dataTask(with: request2) { data, response, error in
        guard let data = data, error == nil else {
            print("error = \(String(describing: error))")
            return
        }
        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(String(describing: response))")
        }

        let responseString = String(data: data, encoding: .utf8)
        print("responseString = \(String(describing: responseString))")

    }
    task2.resume()
}

@IBAction func buttonPress(_ sender: Any) {
    let session = URLSession.shared
    connectToRFID(session)
    print("One")
    openRFID(session)
}

我还看了几篇其他帖子,但大多数帖子只告诉我如何提交POST。顺便说一句,connectToRFID函数登录,(它响应登录后的页面),但openRFID在控制台中没有返回任何内容。

1 个答案:

答案 0 :(得分:0)

URLSession任务异步工作。所以你不能在主线程中逐行调用它们。你需要等待回应。在你的情况下:

登录任务完成后,您需要调用openRFID函数。

func connectToRFID(_ session: URLSession) {

    let addressOne = URL(string: "http://192.168.99.25/ACT_ID_1")!
    let postOne = "username=admin&pwd=password&logId=20101222"

    var request = URLRequest(url: addressOne)

    request.httpMethod = "POST"
    request.httpBody = postOne.data(using: .utf8)
    let task = session.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {                                                 // check for fundamental networking error
            print("error = \(String(describing: error))")
            return
        }

        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print("response = \(String(describing: response))")
        }
        else {
            self.openRFID(URLSession.shared)
            let responseString = String(data: data, encoding: .utf8)
            print("responseString = \(String(describing: responseString))")
            print()
        }
        let responseString = String(data: data, encoding: .utf8)
        print("responseString = \(String(describing: responseString))")
        print()
    }
    task.resume()
}