POST請求json解析

Swift

1.導(dǎo)入Reachability第三方(改成橋接)

2.info.plist文件

3 .AppDelegate.swift

let recipeVC = RecipeViewController()

? ? ? ? recipeVC.navigationItem.title = "菜譜"

? ? ? ? let nav = UINavigationController.init(rootViewController: recipeVC)

? ? ? ? self.window?.rootViewController = nav

3.申明的RecipeUIViewController

let scrW = UIScreen.main.bounds.size.width

let scrH = UIScreen.main.bounds.size.height

//給UIController添加擴(kuò)展extension UIViewController{?

?func showAlert(msg:String,sec:TimeInterval){

?var alertVC = UIAlertController(title: nil, message: msg, preferredStyle: .alert)?

?//從vc控制器顯示彈出提示控制器 self.present(alertVC, animated: true, completion: nil)

?//延時(shí)執(zhí)行隱藏操作 self.perform(#selector(hideAlertVC(sendle:)), with: alertVC, afterDelay: sec)}?

?@objc func hideAlertVC(sendle:UIAlertController) { sendle.dismiss(animated: true, completion: nil) }

}

class RecipeViewController: UIViewController,UITextFieldDelegate {

?var recipeTF:UITextField?//菜譜輸入框

?var searchBtn:UIButton? override func viewDidLoad() { super.viewDidLoad()?

?self.view.backgroundColor = UIColor.white?

?// Do any additional setup after loading the view.

?recipeTF = UITextField.init(frame: CGRect(x: 0, y: 0, width: 200, height: 50)) recipeTF?.center = CGPoint(x:scrW/2 , y: 200)?

?recipeTF?.borderStyle = .line recipeTF?.placeholder = "請輸入查詢的菜譜" recipeTF?.textColor = UIColor.blue?

?recipeTF?.textAlignment = .center?

?recipeTF?.clearButtonMode = .whileEditing recipeTF?.delegate = self self.view.addSubview(recipeTF!)

?searchBtn = UIButton.init(frame: CGRect(x: 0, y: 0, width: 100, height: 50)) searchBtn?.center = CGPoint(x: scrW/2, y: 300)?

?searchBtn?.setTitle("點(diǎn)擊查詢", for: .normal)

?searchBtn?.backgroundColor = UIColor.blue searchBtn?.setTitleColor(UIColor.yellow, for: .normal) searchBtn?.addTarget(self, action: #selector(btnDidPress(sendle:)), for: .touchUpInside) self.view.addSubview(searchBtn!) }?

?@objc func btnDidPress(sendle:UIButton) -> Void { if (recipeTF?.text?.isEmpty)!

{ self.showAlert(msg: "信息不可為空", sec: 2.0) return }?

?//實(shí)例化結(jié)果控制器 let resultVC = RecioeResultViewController()

?//傳遞數(shù)據(jù) resultVC.passString = (recipeTF?.text)!?

?//控制器跳轉(zhuǎn) self.navigationController?.pushViewController(resultVC, animated: true) }?

?// MARK: - -------delegate---- func textFieldShouldReturn(_ textField: UITextField) -> Bool {

?//放棄第一響應(yīng) textField.resignFirstResponder() return true }

?//MARK: - -------touchesBegan-------- override func touchesBegan(_ touches: Set, with event: UIEvent?) {

? ? ? ? super.touchesBegan(touches, with: event)

? ? ? ? self.view.endEditing(true)

? ? }

}

3.傳遞數(shù)據(jù)的RecioeResultUIvieweController

class RecioeResultViewController: UIViewController,UITableViewDataSource {


? ? var passString:String = ""

? ? var table:UITableView?

? ? var tableData:[Recipe]?


? ? override func viewDidLoad() {

? ? ? ? super.viewDidLoad()

? ? ? ? self.view.backgroundColor = UIColor.white

? ? ? ? // Do any additional setup after loading the view.

? ? ? ? self.navigationItem.title = "\"\(passString)\"的搜索結(jié)果,"

? ? ? ? table = UITableView(frame: CGRect.init(x: 0, y: 0, width: scrW, height: scrH), style: .plain)

? ? ? ? table?.dataSource = self

? ? ? ? self.view.addSubview(table!)

? ? }


? ? override func viewWillAppear(_ animated: Bool) {

? ? ? ? super.viewWillAppear(animated)


? ? ? ? let urlSer = URLService()

? ? ? ? urlSer.seachRecipes(search: self.passString, vc: self) { (data, success) in

? ? ? ? ? ? if !success{

? ? ? ? ? ? ? ? return

? ? ? ? ? ? }

? ? ? ? ? ? self.tableData = data as? [Recipe]

? ? ? ? ? ? DispatchQueue.main.async {

? ? ? ? ? ? ? ? self.table?.reloadData()

? ? ? ? ? ? }

?? ? ? ?}

? ? }


? ? func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

? ? ? ? if let count = self.tableData?.count{

? ? ? ? ? ? return count

? ? ? ? }

? ? ? ? return 0

? ? }


? ? func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

? ? ? ? let idient = "cell"

? ? ? ? var cell = tableView.dequeueReusableCell(withIdentifier: idient)

? ? ? ? if cell == nil{


? ? ? ? ? ? cell = UITableViewCell.init(style: .subtitle, reuseIdentifier: idient)

? ? ? ? }

? ? ? ? let one = self.tableData![indexPath.row] as! Recipe

? ? ? ? cell?.textLabel?.text = one.name

? ? ? ? cell?.detailTextLabel?.text = one.content

? ? ? ? return cell!

? ? }

4.URLService繼承NSObject

func seachRecipes(search:String,vc:UIViewController,compltion:@escaping (Any,Bool)->Void) {

? ? ? ? //(1)判斷有無網(wǎng)絡(luò)

? ? ? ? if Reachability.forLocalWiFi().currentReachabilityStatus() == NotReachable && Reachability.forInternetConnection().currentReachabilityStatus() == NotReachable{

? ? ? ? ? ? vc.showAlert(msg: "網(wǎng)絡(luò)錯(cuò)誤,請檢查網(wǎng)絡(luò)", sec: 3.0)

? ? ? ? ? ? compltion("error",false)

? ? ? ? ? ? return

? ? ? ? }

? ? ? ? //(2)狀態(tài)欄中的菊花開始轉(zhuǎn)動

? ? ? ? UIApplication.shared.isNetworkActivityIndicatorVisible = true

? ? ? ? ? //(3)網(wǎng)址字符串封裝

? ? ? ? let url = URL.init(string: "http://api.jisuapi.com/recipe/search")

? ? ? ? //(4)創(chuàng)建請求對象

? ? ? ? var req = URLRequest(url: url!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 15.0)

? ? ? ? //()使用Post請求網(wǎng)絡(luò)數(shù)據(jù)

? ? ? ? req.httpMethod = "POST"

? ? ? ? // 將所有的參數(shù)拼接成一個(gè)字符串

? ? ? ? let str = "keyword=\(search)&num=10&appkey=de394933e1a3e2db"

? ? ? ? //設(shè)置請求對象的請求體

? ? ? ? req.httpBody = str.data(using: .utf8)

? ? ? ? //(5)會話對象請求服務(wù)器數(shù)據(jù)

? ? ? ? URLSession.shared.dataTask(with: req) { (data, response, error) in

? ? ? ? //停止菊花

? ? ? ? ? ? DispatchQueue.main.async {

? ? ? ? ? ? ? ? UIApplication.shared.isNetworkActivityIndicatorVisible = false

? ? ? ? ? ? }

? ? ? ? ? ? //如果服務(wù)器連接失敗

? ? ? ? ? ? if error != nil{

? ? ? ? ? ? ? ? DispatchQueue.main.async {

? ? ? ? ? ? ? ? ? ? vc.showAlert(msg: "服務(wù)器超時(shí)", sec: 2.6)

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return

? ? ? ? ? ? }

? ? ? ? ? ? //json解析

? ? ? ? ? ? let jsonData = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments)

? ? ? ? ? ? if jsonData == nil{

? ? ? ? ? ? ? ? DispatchQueue.main.async {

? ? ? ? ? ? ? ? ? ? vc.showAlert(msg: "網(wǎng)絡(luò)數(shù)據(jù)錯(cuò)誤", sec: 3.3)

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return

? ? ? ? ? ? }

? ? ? ? ? ? //如果正確,將Json數(shù)據(jù)返回給Controller

? ? ? ? ? ? let jsonDic = jsonData as! NSDictionary

? ? ? ? ? ? let status = jsonDic.value(forKey: "status")as! NSString

? ? ? ? ? ? let msg = jsonDic.value(forKey: "msg")as! String


? ? ? ? ? ? if status.intValue != 0{

? ? ? ? ? ? ? ? DispatchQueue.main.async {

? ? ? ? ? ? ? ? ? ? vc.showAlert(msg: msg, sec: 2.0)

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return

? ? ? ? ? ? }

? ? ? ? ? ? //得到j(luò)son數(shù)據(jù)中result字段對應(yīng)的字典

? ? ? ? ? ? let resultDic = jsonDic.value(forKey: "result")as! NSDictionary

? ? ? ? ? ? //得到result字典中的list數(shù)組

? ? ? ? ? ? let listArr = resultDic.value(forKey: "list")as! NSArray

? ? ? ? ? ? //Model封裝

? ? ? ? ? ? var modelArr:[Recipe] = []

? ? ? ? ? ? //遍歷數(shù)組中的每個(gè)字典

? ? ? ? ? ? for item in listArr{

? ? ? ? ? ? ? ? let itemDic = item as! NSDictionary

? ? ? ? ? ? ? ? //實(shí)例化一個(gè)

? ? ? ? ? ? ? ? let one = Recipe()

? ? ? ? ? ? ? ? one.name = itemDic.value(forKey: "name") as! String

? ? ? ? ? ? ? ? one.id = itemDic.value(forKey: "id") as! String

? ? ? ? ? ? ? ? one.content = itemDic.value(forKey: "content") as! String


? ? ? ? ? ? ? modelArr.append(one)


? ? ? ? ? ? }

? ? ? ? ? ? print(jsonData)

? ? ? ? ? ? compltion(modelArr,true)


? ? ? ? }.resume()

? ? }

}

5.Recipe繼承NSobject


? ? var id:String?

? ? var classid:String?

? ? var name:String?

? ? var peoplenum:String?

? ? var preparetime:String?

? ? var content:String?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容