Proper usage of the Alamofire's URLRequestConvertible

前端 未结 6 932
鱼传尺愫
鱼传尺愫 2020-12-07 07:58

I\'ve read couple tutorials, README from @mattt but can\'t figure out couple things.

  1. What is the proper usage of URLRequestConvertible in real

6条回答
  •  星月不相逢
    2020-12-07 08:31

    I found a way to work with it, I created a Class with the Router in it: inherit classes from a request

    file request.swift

    class request{
    
        func login(user: String, password: String){
            /*use Router.login(params)*/
        }
        /*...*/
        enum Router: URLRequestConvertible {
            static let baseURLString = "http://example.com"
            static let OAuthToken: String?
    
            case Login([String: AnyObject])
            /*...*/
    
            var method: Alamofire.Method {
                switch self {
                case .Login:
                    return .POST
                /*...*/
            }
    
            var path: String {
                switch self {
                case .Login:
                    return "/login"
                /*...*/
                }
            }
    
            var URLRequest: NSURLRequest {
                switch self {
                    case .Login(let parameters):
                        return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
                    /*...*/
                    default:
                        return mutableURLRequest
                }
            }
        }
    }
    

    file requestContacts.swift

    class requestContacts: api{
    
        func getUser(id: String){
            /*use Router.getUser(id)*/
        }
        /*...*/
    
        enum Router: URLRequestConvertible {
    
            case getUser(id: String)
            case setUser([String: AnyObject])
    
            var method: Alamofire.Method {
                switch self {
                    case .getUser:
                        return .GET
                    case .setUser:
                        return .POST
                    /*...*/
                }
            }
    
            var path: String {
                switch self {
                case .getUser(id: String):
                    return "/user\(id)/"
                case .setUser(id: String):
                    return "/user/"
                /*...*/
                }
            }
            // MARK: URLRequestConvertible
    
            var URLRequest: NSURLRequest {
                //use same baseURLString seted before
                let URL = NSURL(string: Router.baseURLString)!
                    let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
                    mutableURLRequest.HTTPMethod = method.rawValue
    
                if let token = Router.OAuthToken {
                    mutableURLRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
                }
                switch self {
                    /*...*/
                    case .setUser(let parameters):
                        return Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
                    default: //for GET methods, that doesent need more
                        return mutableURLRequest
                }
            }
        }
    }
    

    so the son class will get paramethers of Router from the parent, and you can even use Route.login in any son. still, dont know if there is a way to get a short URLRequest, so i dont need to set parameters again and again

提交回复
热议问题