Make REST API call in Swift

前端 未结 15 1320
被撕碎了的回忆
被撕碎了的回忆 2020-12-02 04:20

I\'m trying to use Swift to make a GET call to a REST API, and have tried to follow numerous tutorials, but can\'t figure it out. Either because I cannot figure out how to

相关标签:
15条回答
  • 2020-12-02 04:54

    You can do like this :

    var url : String = "http://google.com?test=toto&test2=titi"
    var request : NSMutableURLRequest = NSMutableURLRequest()
    request.URL = NSURL(string: url)
    request.HTTPMethod = "GET"
    
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue(), completionHandler:{ (response:NSURLResponse!, data: NSData!, error: NSError!) -> Void in
        var error: AutoreleasingUnsafeMutablePointer<NSError?> = nil
        let jsonResult: NSDictionary! = NSJSONSerialization.JSONObjectWithData(data, options:NSJSONReadingOptions.MutableContainers, error: error) as? NSDictionary
    
        if (jsonResult != nil) {
            // process jsonResult
        } else {
           // couldn't load JSON, look at error
        }
    
    
    })
    

    EDIT : For people have problem with this maybe your JSON stream is an array [] and not an object {} so you have to change jsonResult to NSArray instead of NSDictionary

    0 讨论(0)
  • 2020-12-02 04:55

    I think the NSURLSession api fits better in this situation. Because if you write swift code your project target is at least iOS 7 and iOS 7 supports NSURLSession api. Anyway here is the code

    let url = "YOUR_URL"
    
    NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)) { data, response, error in
        // Handle result
    }.resume()
    
    0 讨论(0)
  • 2020-12-02 04:56

    swift 4

    USE ALAMOFIRE in our App plz install pod file

    pod 'Alamofire', '~> 4.0'

    We can Use API for Json Data -https://swapi.co/api/people/

    Then We can create A networking class for Our project- networkingService.swift

    import Foundation
    import Alamofire
    typealias JSON = [String:Any]
    class networkingService{
         static let shared = networkingService()
        private init() {}
        func getPeople(success successblock: @escaping (GetPeopleResponse) -> Void)
        {
        Alamofire.request("https://swapi.co/api/people/").responseJSON { response in
            guard let json = response.result.value as? JSON else {return}
           // print(json)
            do {
                    let getPeopleResponse = try GetPeopleResponse(json: json)
                    successblock(getPeopleResponse)
                }catch{}
        }
        }
        func getHomeWorld(homeWorldLink:String,completion: @escaping(String) ->Void){
            Alamofire.request(homeWorldLink).responseJSON {(response) in
                guard let json = response.result.value as? JSON,
                let name = json["name"] as? String
                    else{return}
                completion(name)
            }
    }
    }
    

    Then Create NetworkingError.swift class

    import Foundation
    enum networkingError : Error{
        case badNetworkigStuff
    
    }
    

    Then create Person.swift class

    import Foundation
    struct Person {
        private let homeWorldLink : String
        let birthyear : String
        let gender : String
        let haircolor : String
        let eyecolor : String
        let height : String
        let mass : String
        let name : String
        let skincolor : String
        init?(json : JSON) {
            guard let birthyear = json["birth_year"] as? String,
            let eyecolor = json["eye_color"] as? String,
            let gender = json["gender"] as? String,
            let haircolor = json["hair_color"] as? String,
            let height = json["height"] as? String,
            let homeWorldLink = json["homeworld"] as? String,
            let mass = json["mass"] as? String,
            let name = json["name"] as? String,
            let skincolor = json["skin_color"] as? String
            else { return nil }
            self.homeWorldLink = homeWorldLink
            self.birthyear = birthyear
            self.gender = gender
            self.haircolor = haircolor
            self.eyecolor = eyecolor
            self.height = height
            self.mass = mass
            self.name = name
            self.skincolor = skincolor
        }
        func homeWorld(_ completion: @escaping (String) -> Void)  {
            networkingService.shared.getHomeWorld(homeWorldLink: homeWorldLink){ (homeWorld) in
                completion(homeWorld)
            }
        }
    }
    

    Then create DetailVC.swift

    import UIKit
    class DetailVC: UIViewController {
        var person :Person!
        @IBOutlet var name: UILabel!
        @IBOutlet var birthyear: UILabel!
        @IBOutlet var homeworld: UILabel!
        @IBOutlet var eyeColor: UILabel!
        @IBOutlet var skinColor: UILabel!
        @IBOutlet var gender: UILabel!
        @IBOutlet var hairColor: UILabel!
        @IBOutlet var mass: UILabel!
        @IBOutlet var height: UILabel!
        override func viewDidLoad() {
            super.viewDidLoad()
           print(person)
            name.text = person.name
            birthyear.text = person.birthyear
            eyeColor.text = person.eyecolor
            gender.text = person.gender
            hairColor.text = person.haircolor
            mass.text = person.mass
            height.text = person.height
            skinColor.text = person.skincolor
            person.homeWorld{(homeWorld) in
                self.homeworld.text = homeWorld
            }
        }
    }
    

    Then Create GetPeopleResponse.swift class

    import Foundation
    struct GetPeopleResponse {
        let people : [Person]
        init(json :JSON) throws {
            guard let results = json["results"] as? [JSON] else { throw networkingError.badNetworkigStuff}
            let people = results.map{Person(json: $0)}.flatMap{ $0 }
            self.people = people
            }
    }
    

    Then Our View controller class

    import UIKit
    
    class ViewController: UIViewController {
    
        @IBOutlet var tableVieww: UITableView!
        var people = [Person]()
    
    
        @IBAction func getAction(_ sender: Any)
        {
        print("GET")
            networkingService.shared.getPeople{ response in
                self.people = response.people
               self.tableVieww.reloadData()
            }
        }
        override func prepare(for segue: UIStoryboardSegue, sender: Any?)
        {
            guard segue.identifier == "peopleToDetails",
            let detailVC = segue.destination as? DetailVC,
            let person = sender as AnyObject as? Person
            else {return}
            detailVC.person = person
            }
    }
        extension ViewController:UITableViewDataSource{
            func numberOfSections(in tableView: UITableView) -> Int {
                return 1
            }
            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                return people.count
            }
            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
             let cell = UITableViewCell()
                cell.textLabel?.text = people[indexPath.row].name
    
                return cell
    
            }
        }
    extension ViewController:UITableViewDelegate{
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            performSegue(withIdentifier: "peopleToDetails", sender: people[indexPath.row])
        }
    }
    

    In our StoryBoard

    plz Connect with our View with another one using segue with identifier -peopleToDetails

    • Use UITableView In our First View

    • Use UIButton For get the Data

    • Use 9 Labels in our DetailVc

    0 讨论(0)
提交回复
热议问题