iOS开发-登录界面开发(5)AFNetworking的网络请求-Swfit4.1_Xcode9.3.1
1.建立Tools文件夹:
2.新建一个Swift File,用于封装网络请求,名字比如“AFNetworkingManager”:
import Foundation
import AFNetworking
// 定义枚举类型
enum HTTPRequestType : Int{
case GET = 0
case POST
}
class NetworkTools: AFHTTPSessionManager {
// 设计单例 let是线程安全的
static let shareInstance : NetworkTools = {
let tools = NetworkTools()
tools.responseSerializer.acceptableContentTypes?.insert("text/html")
return tools
}()
}
// 封装请求方法
extension NetworkTools {
func request(methodType : HTTPRequestType, urlString : String, parameters : [String : AnyObject], finished :@escaping (_ result : AnyObject?, _ error : Error?)-> ()) {
// 1 成功回调
let successCallBack = {(task :URLSessionDataTask, result : Any) in
finished(result as AnyObject?, nil)
}
// 2 失败回调
let failureCallBack = {(task : URLSessionDataTask?, error :Error) in
finished(nil, error)
}
if methodType == .GET {
// get请求
get(urlString, parameters: parameters, progress: nil, success: successCallBack, failure: failureCallBack)
}else {
// post请求
post(urlString, parameters: parameters, progress: nil, success: successCallBack, failure: failureCallBack)
}
}
}
3.“import AFNetworking”可能会报错,这个是Xcode的一个Bug,我们按command+N,重新编译一下项目就好了
4.我们给登录按钮点击事件,增加网络请求和json解析:
import UIKit
import SwiftyJSON
class ViewController: UIViewController {
@IBOutlet weak var et_vip_code: UITextField! // VIP号码
@IBOutlet weak var bt_login: UIButton! // 登录按钮
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// 登录按钮 的 点击事件
@IBAction func bt_login_clicked(_ sender: Any) {
//创建请求参数
// let params = ["VIP_keyworld":"595466","password":"123456"] // 多个参数写法
// let params = ["VIP_keyworld":"595466"]
let vipCode = et_vip_code.text!
let params = ["VIP_keyworld":vipCode] // 请求参数
let loginUrl = "http://www.xxxxxx.com/login.asp" // 请求地址
// 使用 AFNetworking 发送POST请求
NetworkTools.shareInstance.request(methodType: .POST, urlString: loginUrl, parameters: params as [String : AnyObject]) { (result : AnyObject?, error : Error?) in
if error != nil {
print(error!)
return
}
print(result!)
// 使用 SwiftyJSON 解析json -- 这里解析的是 jsonObject
// 如果要解析 jsonArray, SwiftyJSON 更加丝滑, 参考 http://www.hangge.com/blog/cache/detail_968.html
let json = JSON(result as Any)
if let vip_id = json["id"].string {
print("id是:",vip_id)
}
}
}
// 输入框内容 改变 监听
@IBAction func et_vip_code_changed(_ sender: Any) {
let vipCode = et_vip_code.text!
if vipCode.count > 0 {
bt_login.backgroundColor = #colorLiteral(red: 0.1921568627, green: 0.5411764706, blue: 1, alpha: 1) // 已经输入VIP号码 登录按钮背景色
} else{
bt_login.backgroundColor = #colorLiteral(red: 0.3137254902, green: 0.3921568627, blue: 0.5137254902, alpha: 1) // 没有输入VIP号码 登录按钮背景色
}
}
}
5.至此,应该是结束了,但是会报错,可以理解为没有网络权限:
NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection
翻译:因为应用程序传输安全策略需要使用安全连接,所以无法加载资源
6.增加网络权限:
6.1.点击项目,点击info,点击Custom iOS Target Properties,创建 App Transport Security Settings 的 Dictionary:
6.2.在其里面 创建Allow Arbitrary Loads的Boolean 值为YES:
7.看一下效果(忽略渣画质):
8.好了,我们把登录界面的UI和网络请求,都实现了。