ios - 使用 Alamofire 在 Swift 中调用 Api?

标签 ios swift api

下面是我用于 API 调用的代码,这里有任何其他方法可以减少所有 View Controller 的代码。我可以创建 alamofire API 调用的模型类吗?

Login Screen

 func ForgotPasswordServiceCall()  {
    
    
    let params = [
        "email":EmailTextField.text!,
        ]
    
    let strUrl = "forgotPassword?"
    
    PKHUD.sharedHUD.contentView = PKHUDProgressView()
    PKHUD.sharedHUD.show()
    
    Alamofire.request(strUrl, method: .post, parameters: params, encoding: URLEncoding.httpBody)
        .responseJSON{ response in
            
            PKHUD.sharedHUD.hide()
            if((response.result.value) != nil)
            {
                let swiftyJsonVar = JSON(response.result.value!)
                
                if let resData = swiftyJsonVar.dictionaryObject
                {
                    
                    if(resData["status"] as! String == "success")
                    {
                      //self.arrData = resData["result"] as! [[String:String]]
                      //self.arrData = resData["result"] as! [NSDictionary]
                     //cel.text=self.arrData[indexPath.row].object(forKey:""] 
                     //as! NSString)as String 
                    }else{
                    }
                }
            }
            else
            {
            }
    }
}

最佳答案

您肯定可以减少所有 View Controller 的代码 -

  1. 创建一个基类来处理所有 rest api 请求(GET、POST、PUT 等)。
  2. 为 JSON 对象制作模型类。

让我举个例子——

基类——

class WebServiceHandler : NSObject {


override init() {
    // perform some initialization here

}


func processSingleRecord() -> Bool {
    return false
}

func getWebServiceUrl() -> String{
    return ""
}
func DisplayNetworkAvailabilityMessage()-> String{
    return "network failed"
}

func fetchDataFromWebServicePost<T: Mappable>(_ parameters: Dictionary<String , AnyObject>, closure:@escaping (_ response: T) -> Void) {

    let url = getWebServiceUrl()
     Alamofire.request(url, method: .post, parameters: parameters, headers: nil).responseJSON { (response:DataResponse<Any>) in
            print(response.request)  // original URL request
            print(response.response) // URL response
            //                print(response.data)     // server data
            print("Result",response.result)   // result of response serialization
            print("parameters = \(parameters)")
            if let JSON = response.result.value {
                print("JSON: \(JSON)")
            }
            SVProgressHUD.dismiss()
            switch response.result {
            case .success(_):
                if response.response?.statusCode == 200 || response.response?.statusCode == 201 {
                    var user = Mapper<T>().map(JSONObject: response.result.value)
                    if self.processSingleRecord() == true {
                        user = Mapper<T>().map(JSONObject: (response.result.value as! NSArray).object(at: 0))
                    }
                    closure(user! )
                }
                else if response.response?.statusCode == 0{

                }
                else  {
                    if let _ = response.result.value as? Error {
                    }
                }
            case .failure(let error):
                debugPrint("getEvents error: \(error)")
                SVProgressHUD.dismiss()
            }
        }.responseString { response in
            //                print("Success: \(response.result.isSuccess)")
            //                print("Response String: \(response.result.value)")
    }
} }

单个 api 的模型类 -

    class DeviceTokenDataHandler : WebServiceHandler
  {

    override func getWebServiceUrl() -> String{
        return ApiLinks.sharedInstance.deviceTokenLink()
    }

    override func DisplayNetworkAvailabilityMessage()-> String{
        return "Check your internet connection"
    }    

}

定义所有 api 链接的 ApiLinks 类 -

import Foundation
class ApiLinks : NSObject {

    var prod = Bool()
    var dev = Bool()
    var httpPart = "http://"

    var localHost = "put your base url here"
    var prodHost = "put your base url here"


    var apiExtension = ""//".php" for php apisf
    var separater = "/"
    var host = String()

    static let sharedInstance = ApiLinks()

    //handle the dev or prod modes    
    func setTheProdStatus(_ prodVaule : Bool) {
        prod = prodVaule
        if(prod) {
            host = prodHost
        } else {
            host = localHost
        }
    }

    let deviceToken = "updatedevicetoken" // your api name here
    func deviceTokenLink() -> String {
        return "\(httpPart)\(host)\(separater)\(deviceToken)\(apiExtension)"

}

响应模型类 -

    import ObjectMapper
import AlamofireObjectMapper
class DeviceTokenResponse: Mappable {
    var user_id: Int?
    var message: String?
    var status: String?
    required init?(map: Map){

    }

    func mapping(map: Map) {
        user_id <- map["user_id"]
        message <- map["message"]
        status <- map["status"]
    }
}

现在这就是你从 viewcontroller 调用 api 的方式 -

func updateDeviceToken() {        
        let anotherWebServiceHandler = DeviceTokenDataHandler.init()
        anotherWebServiceHandler.fetchDataFromWebServicePost(["app_type":"user" as AnyObject], closure: { (response:SignUpResponse) -> Void in
            print(response.message);
        })
    }

关于ios - 使用 Alamofire 在 Swift 中调用 Api?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47964165/

相关文章:

ios - 使用 IGListKit 在layoutSubviews() 中更改 UICollectionView 的框架和 contentInset

ios - 如何使用组合框架 NSObject.KeyValueObservingPublisher?

iphone - 如何在 AVAudioPlayer 发布时调试此死锁?

ios - 在iOS 7中点击UITableView时,所有UITableCells都消失

api - Paypal Payment REST API 网页体验简介

api - 用于读取 "plus one"计数的 Google+ API

api - YouTubeDataAPI中的“Access Not Configured”错误

iphone - StatusBar 全屏 View 关闭错误

swift - 通过点对点同时发送 String 和 NSData?

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?