简体   繁体   English

如何在Swift 3 iOS中使用Model类进行REST API调用

[英]how make REST API Call with Model class in swift 3 ios

i want to make REST API call in swift 3.0 with model classes of API code . 我想使用API​​代码的模型类在swift 3.0中进行REST API调用。 Can any one help me to solved my issue? 有人可以帮助我解决我的问题吗?

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()

    }

i have used general code of NSurlsession for API call but it's too much code i have to write every time in every call. 我已经使用NSurlsession的通用代码进行API调用,但是每次调用中每次都要写太多代码。 so i want common class for API CAll. 所以我想要API CAll的通用类。 but how to make common class for API call in swift 3.0 但是如何在Swift 3.0中使API调用成为通用类

Try something like that 试试这样的东西

 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")

  }


}
}
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()
}}

BASEWEBSERVICE_ClASS: BASEWEBSERVICE_ClASS:

// where RTCommonResponse is common response Model class. //其中RTCommonResponse是通用响应模型类。 generated by ahmad ali json exporter tool. 由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: 忘记密码WS_Class:

// where RTForgotPasswordResponse is common response Model class. //其中RTForgotPasswordResponse是通用响应模型类。 generated by ahamad ali json exporter tool. 由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: YourVIEWCONTROLLER_Class:

// just add extension to your view controller //只需将扩展添加到您的视图控制器

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")
        }
    }

}

// when you call API you have to write JUST line of CODE That's IT!!! //当您调用API时,您必须编写仅这行代码!

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

Another simple way to call web API 调用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()

    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM