我一直在尝试制作一个简单的应用程序来打开我工作中的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
在控制台中没有返回任何内容。
答案 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()
}