POST请求json解析

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?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容