如何使用swift 3 ios中的Model类调用REST API

时间:2017-12-26 12:52:12

标签: ios json swift

我想在swift 3.0中使用API​​代码的模型类进行REST API调用。任何人都可以帮我解决我的问题吗?

let USER_LIST_FIRMWISE_URL = "\(BASE_URL2)user_list_firm_wise.php"

func userListFirmwiseRequest(firmid:String) -> URLRequest {
        let Url = URL(string: (utility?.USER_LIST_FIRMWISE_URL)!)
        var request = URLRequest(url: Url!)
        request.httpMethod = "POST"
        request.cachePolicy = .reloadIgnoringCacheData
        let paramString = "firm_id=\(firmid)"
        request.httpBody = paramString.data(using: String.Encoding.utf8)
        return request
    }


func getuserList() -> Void {

        var request = mainApp.reqRes?.userListFirmwiseRequest(firmid: firmID)
        request?.httpMethod = "POST"
        print("request")

        EZLoadingActivity.show("", disableUI: true)
        let task = URLSession.shared.dataTask(with: request!) { (data: Data?, response: URLResponse?, error: Error?) in

            DispatchQueue.main.async
                {
                    do {


                        guard let data = data, error == nil else {
                            print("Error=\(String(describing: error))")
                            return
                        }
                        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200{
                            print("Status code should be 200, but is \(httpStatus.statusCode)")
                            print("Response String:\(String(describing: response))")
                        }

                        let jsonString = try? JSONSerialization.jsonObject(with: data, options: [])

                        guard let JsonObject = try? jsonString as AnyObject else{
                            return
                        }

                        guard let Success = try? JsonObject["success"] as! Int else{
                            return
                        }
                        print("Succee Resul :\(Success)")

                        if Success > 0{
                            guard let Message = try? JsonObject["message"] as Any else{
                                return
                            }

                            guard let JsonObjectForUser = try? Message as? AnyObject else {
                                return
                            }
                        }


                        let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary ?? nil

                        if let parseJSON = json {
                            let dataDic = parseJSON.value(forKey: "message") as! NSMutableArray


                            self.arrayUserNameList = dataDic.value(forKey: "user_name") as! [String]

                            self.arrayUserData = dataDic
                            print(self.arrayUserNameList)

                            self.picker.reloadAllComponents()
                            EZLoadingActivity.hide()
                        }
                    } catch{
                        print(error)
                        EZLoadingActivity.hide()
                    }
            }

        }

        task.resume()

    }

我已经使用NSurlsession的通用代码进行API调用,但是每次调用时我都必须编写太多的代码。所以我想要API CAll的通用类。但是如何在swift 3.0中为API调用创建公共类

4 个答案:

答案 0 :(得分:0)

尝试类似的东西

 import Foundation

 struct modelApi {

     var arrayUserData: NSMutableArray = []
     var arrayUserNameList: [String] = []


 init(data:Data)
 {

      do {


    let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary ?? nil

    if let parseJSON = json
    {
        let dataDic = parseJSON.value(forKey: "message") as! NSMutableArray

        self.arrayUserNameList = dataDic.value(forKey: "user_name") as! [String]

        self.arrayUserData = dataDic

    }


  }
  catch
  { 
         print("Error")

  }


}
}

答案 1 :(得分:0)

import Foundation
class HttpRequest{


static let TIME_OUT_FOR_RESOURCE = 60.0


static let TIME_OUT_FOR_REQUEST = 30
static func sendHttpGetRequest(endPoint:String,responseMsg:@escaping (_ responseString:String?,_ error:String?)->Void)   {

    //        let JSON_CONTENT_TYPE = "application/json"
    //        let HTTP_OK = 200

    //Content Types
    //1  ""Content-Type" = "text/html; charset=UTF-8";"
    //2 "Content-Type" = "application/json";

    let url = URL.init(string: endPoint)

    let session = URLSession.shared
    session.configuration.timeoutIntervalForRequest = TimeInterval(TIME_OUT_FOR_REQUEST)
    session.configuration.timeoutIntervalForResource = TimeInterval(TIME_OUT_FOR_RESOURCE)



    let task =   session.dataTask(with: url!) {
        data,
        response ,
        error        in


        guard error == nil
            else{

                responseMsg(nil,error!.localizedDescription)
                return }

        let responseString = String.init(data: data!, encoding: String.Encoding.utf8)!
        responseMsg(responseString,nil)



    }
    task.resume()



}


static  func setHttpPostRequest(endPoint:String,param:[String:Any],responseMsg:@escaping (_ responseJson:[String:Any]?,_ error:String?)->Void){




    let url = URL.init(string:endPoint)

    let session = URLSession.shared
    session.configuration.timeoutIntervalForRequest = TimeInterval(TIME_OUT_FOR_REQUEST)
    session.configuration.timeoutIntervalForResource = TimeInterval(TIME_OUT_FOR_RESOURCE)


    var request = URLRequest.init(url: url!)

    request.httpMethod = "POST"

    do{
        request.httpBody = try JSONSerialization.data(withJSONObject: param, options: .prettyPrinted)

    }catch let error{
        print(error)
    }
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")


    let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in

        guard error == nil else {
            responseMsg(nil,error?.localizedDescription)
            return
        }

        guard let data = data else {
            responseMsg(nil,"Something went wrong")
            return
        }

        do {
            //create json object from data
            if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
                responseMsg(json,nil)

                // print(json)
                // handle json...
            }
        } catch let error {
            responseMsg(nil,error.localizedDescription)
            // print(error.localizedDescription)
        }
    })
    task.resume()
}}

答案 2 :(得分:0)

<强> BASEWEBSERVICE_ClASS:

//其中RTCommonResponse是常见的响应模型类。由ahmad ali json导出工具生成。

import UIKit
import KRProgressHUD
import Foundation
import SystemConfiguration

protocol BaseWebserviceDelegate {
    func sucessful(data : RTCommonResponse)
    func failedWithMessage(message : String)
}

class BaseWebservice: NSObject
{
    var webData : NSMutableData!
    var statusCode : Bool!
    var appDelegate : AppDelegate!
    var baseDelegate : BaseWebserviceDelegate!
    let opQueue = OperationQueue()

    func initWithDelegate(aDelegate : BaseWebserviceDelegate)  {
        baseDelegate = aDelegate
        appDelegate = UIApplication.shared.delegate as! AppDelegate
        //return self
    }

    func callWithBaseRequest(requestData : Dictionary<String, Any>, aURL : String, method : String, showHUD : Bool )  {

        let hudShow = showHUD && BaseWebservice.isInternetAvailable()

        let url4 = URL(string: aURL as String)!


        //let session4 = URLSession(configuration: sessionConfiguration, delegate: self, delegateQueue: self.opQueue)
        //let session4 = URLSession.shared
        let session4: URLSession = {
            let configuration = URLSessionConfiguration.default
            configuration.timeoutIntervalForRequest = 9999
            configuration.timeoutIntervalForResource = 9999
            return URLSession(configuration: configuration, delegate: nil, delegateQueue: nil)
        }()
        let request = NSMutableURLRequest(url: url4)
        request.httpMethod = method

        request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
        //let paramString = "data=Hello"
        //request.httpBody = paramString.data(using: String.Encoding.utf8)

        if method == Constants.POST {

            let cookieHeader = (requestData.flatMap({ (key, value) -> String in
                return "\(key)=\(value)"
            }) as Array).joined(separator: "&")

            let postData : Data = cookieHeader.data(using: .utf8)!
            request.httpBody = postData
            AppDelegate.printLog(log: "Request started for url : " + aURL + " Peram : " + cookieHeader)
        }

        //request.addValue("multipart/form-data", forHTTPHeaderField: "Content-Type")
        let task = session4.dataTask(with: request as URLRequest) { (data, response, error) in
            guard let _: Data = data, let _: URLResponse = response, error == nil else {
                print("*****error " + (error?.localizedDescription)!)

                DispatchQueue.main.async {
                    KRProgressHUD.dismiss()
                     self.baseDelegate.failedWithMessage(message: (error?.localizedDescription)!)
                    UIApplication.shared.isNetworkActivityIndicatorVisible = false
                }
                return
            }
            let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
//            print("*****This is the data 4: \(String(describing: dataString))") //JSONSerialization
            let dictionary: Dictionary? = self.convertToDictionary(text: dataString! as String)
            //let content = Content.init(fromDictionary: dictionary!)
            AppDelegate.printLog(log:"Responce recived for url : " + aURL)
            if dictionary == nil {

                DispatchQueue.main.async {
                    KRProgressHUD.dismiss()
                    self.baseDelegate.failedWithMessage(message: "Something went wrong, try after some time")
                    UIApplication.shared.isNetworkActivityIndicatorVisible = false
                }
                return
            }



            //self.baseDelegate.sucessful(data: commonResponse)
            DispatchQueue.main.async {
                let commonResponse : RTCommonResponse = RTCommonResponse.init(fromDictionary: dictionary!)


                if commonResponse.status == "ok" {
                    self.baseDelegate.sucessful(data: commonResponse)
                    KRProgressHUD.dismiss()
                }else{
                    let error : RTError = RTError.init(fromDictionary: commonResponse.data!)
                    KRProgressHUD.dismiss()
                    self.baseDelegate.failedWithMessage(message: error.error)
                }

                UIApplication.shared.isNetworkActivityIndicatorVisible = false
            }
        }

        //let task = session4.dataTask(with: request as URLRequest)

        if hudShow {
            DispatchQueue.main.async {
                KRProgressHUD.show()

            }
        }
        DispatchQueue.main.async {
            UIApplication.shared.isNetworkActivityIndicatorVisible = true
        }
//        session4

        task.resume()
    }

    func convertToDictionary(text: String) -> [String: Any]? {
        if let data = text.data(using: .utf8) {
            do {
                return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
            } catch {
                print(error.localizedDescription)
            }
        }
        return nil
    }

    static func isInternetAvailable() -> Bool
    {
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)

        let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
                SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
            }
        }

        var flags = SCNetworkReachabilityFlags()
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
            return false
        }
        let isReachable = flags.contains(.reachable)
        let needsConnection = flags.contains(.connectionRequired)
        return (isReachable && !needsConnection)
    }
}

<强> ForgotpasswordWS_Class:

//其中RTForgotPasswordResponse是常见的响应模型类。由ahamad ali json导出工具生成。

import UIKit

protocol ForgotPasswordWebserviceDelegate {
    func forgotPasswordSucessful(data : RTForgotPasswordResponse)
    func forgotPasswordFailedWithMessage(message : String)
}


class ForgotPasswordWebservice: BaseWebservice {
    var delegate : ForgotPasswordWebserviceDelegate!

    init(aDelegate : ForgotPasswordWebserviceDelegate) {
        super.init()
        super.initWithDelegate(aDelegate: self as BaseWebserviceDelegate)
        delegate = aDelegate
    }

    func initWithDelegate(aDelegate : ForgotPasswordWebserviceDelegate)  {
        super.initWithDelegate(aDelegate: self as BaseWebserviceDelegate)
        delegate = aDelegate
        //return self
    }
    func call(request : RTForgotPasswordRequest)  {
        let url = Constants.BASE_URL + "user/retrieve_password/"
        self.callWithBaseRequest(requestData: request.toDictionary() , aURL: url, method: Constants.POST, showHUD: true)
    }
}

extension ForgotPasswordWebservice : BaseWebserviceDelegate{
    func sucessful(data : RTCommonResponse){
        let content = RTForgotPasswordResponse.init(fromDictionary: data.data! )
        //data.content = content
        self.delegate.forgotPasswordSucessful(data: content)
    }
    func failedWithMessage(message : String){
        self.delegate.forgotPasswordFailedWithMessage(message: message)
    }
}

<强> YourVIEWCONTROLLER_Class:

//只需向视图控制器添加扩展程序

extension yourViewController : ForgotPasswordWebserviceDelegate {

    func forgotPasswordFailedWithMessage(message: String) {
        let when = DispatchTime.now() + 1
        DispatchQueue.main.asyncAfter(deadline:when){
            self.showSnackBar(message: message)
        }
    }

    func forgotPasswordSucessful(data: RTForgotPasswordResponse) {

        let when = DispatchTime.now() + 1
        DispatchQueue.main.asyncAfter(deadline:when)  {
            self.showSnackBar(message: data.msg)
            //self.displayAlertMessage(messageToDisplay: "Reset Password Link Send")
        }
    }

}

//当你调用API时,你必须编写JUST的CODE行,那就是IT !!!

@IBAction func forgotbtntapped(_ sender: Any) {
let forgotws : ForgotPasswordWebservice = ForgotPasswordWebservice.init(aDelegate: self)
                let forgotrequest : RTForgotPasswordRequest = RTForgotPasswordRequest();
                forgotrequest.userLogin = forgotEmailTextField.text!
                forgotws.call(request: forgotrequest)
 }

答案 3 :(得分:0)

另一种调用Web API的简单方法

func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }


        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
             return 5
        }

        func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
            if indexPath.row == 0 {
                cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
            }
        }
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

            let cell : CCell = self.tblV.dequeueReusableCell(withIdentifier: "cell") as! CCell

            cell.lblName?.text = "ABCD"

            return cell
        }

        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        }

        func getClassList(completion: ((NSArray?, NSError?) -> Void)?) {
            let myUrl = URL(string: "http://papili.us/studycentral/api/getClassList.php");
            var request = URLRequest(url:myUrl!)
            request.httpMethod = "POST"// Compose a query string
            let postString = "";
            request.httpBody = postString.data(using: String.Encoding.utf8);
            let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
                if error != nil {
                    print("error=\(String(describing: error))")
                    completion?(nil, error as NSError?)
                    return
                }
                    print("response = \(String(describing: response))")

                //Convert response sent from a server side script to a NSDictionary object:
                do {
                    let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                    if json != nil {

                        let newdata : NSDictionary = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary

                        let datalist : KRootClass = KRootClass.init(fromDictionary: newdata as! [String : Any])
                        print(datalist.classID)
                        print(datalist.className)
                        print(datalist.teacherTitle)
                        print(datalist.teacherLastName)
                        print(datalist.teacherFirstName)

                    }
                } catch {
                    print(error)
                    completion?(nil, error as NSError)
                }
            }
            task.resume()

    }