美文网首页
POST请求json解析

POST请求json解析

作者: 鱼那么爱水_7fb0 | 来源:发表于2018-06-01 08:06 被阅读0次

    Swift

    1.导入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添加扩展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)

     //延时执行隐藏操作 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("点击查询", 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 } 

     //实例化结果控制器 let resultVC = RecioeResultViewController()

     //传递数据 resultVC.passString = (recipeTF?.text)! 

     //控制器跳转 self.navigationController?.pushViewController(resultVC, animated: true) } 

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

     //放弃第一响应 textField.resignFirstResponder() return true }

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

            super.touchesBegan(touches, with: event)

            self.view.endEditing(true)

        }

    }

    3.传递数据的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)\"的搜索结果,"

            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)判断有无网络

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

                vc.showAlert(msg: "网络错误,请检查网络", sec: 3.0)

                compltion("error",false)

                return

            }

            //(2)状态栏中的菊花开始转动

            UIApplication.shared.isNetworkActivityIndicatorVisible = true

              //(3)网址字符串封装

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

            //(4)创建请求对象

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

            //()使用Post请求网络数据

            req.httpMethod = "POST"

            // 将所有的参数拼接成一个字符串

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

            //设置请求对象的请求体

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

            //(5)会话对象请求服务器数据

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

            //停止菊花

                DispatchQueue.main.async {

                    UIApplication.shared.isNetworkActivityIndicatorVisible = false

                }

                //如果服务器连接失败

                if error != nil{

                    DispatchQueue.main.async {

                        vc.showAlert(msg: "服务器超时", sec: 2.6)

                    }

                    return

                }

                //json解析

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

                if jsonData == nil{

                    DispatchQueue.main.async {

                        vc.showAlert(msg: "网络数据错误", sec: 3.3)

                    }

                    return

                }

                //如果正确,将Json数据返回给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

                }

                //得到json数据中result字段对应的字典

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

                //得到result字典中的list数组

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

                //Model封装

                var modelArr:[Recipe] = []

                //遍历数组中的每个字典

                for item in listArr{

                    let itemDic = item as! NSDictionary

                    //实例化一个

                    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?

    相关文章

      网友评论

          本文标题:POST请求json解析

          本文链接:https://www.haomeiwen.com/subject/pkkhsftx.html