Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Alamofire 4 SessionManager?

Tags:

I was using Alamofire 3.4 in Swift 2.3 and I need to update my code to Swift 3 and Alamofire 4. I was using Alamofire's Manager to do a POST in a url. I read the documentation about SessionManager and I understand that the request uses the method .GET.

I was using Manager .Response() to get the callback from the request, now that's changed in SessionManager.

How do I make a POST method using SessionManager? And how do I get the response from the request?

This is my original code:

import UIKit
import AEXML
import Alamofire

class Request: NSObject {

    internal typealias RequestCompletion = (statusCode: Int?, error:NSError?) -> ()
    private var completionBlock: RequestCompletion!

    var serverTrustPolicy: ServerTrustPolicy!
    var serverTrustPolicies: [String: ServerTrustPolicy]!
    var afManager: Manager!

    func buildBdRequest(ip : String, serviceStr : String, completionBlock:RequestCompletion){
       let url = getURL(ip, service: serviceStr)
        configureAlamoFireSSLPinningWithCertificateData()
        makeAlamofireRequest(url)

        self.completionBlock = completionBlock
    }

    func makeAlamofireRequest(url : String){
        self.afManager.request(.POST, url)
            .validate(statusCode: 200..<300)
            .response { request, response, data, error in

                print("data - > \n    \(data.debugDescription) \n")
                print("response - >\n    \(response.debugDescription) \n")
                print("error - > \n    \(error.debugDescription) \n")

                var statusCode = 0

                if response != nil {
                    statusCode = (response?.statusCode)!
                }
                   self.completionBlock(statusCode: statusCode, error: error)
        }

    }


    private func getURL(ip : String, service: String) -> String{
        return ip + service;
    }

    func configureAlamoFireSSLPinningWithCertificateData() {
        self.serverTrustPolicies = [ :
            //            "github.com": self.serverTrustPolicy!
        ]

        self.afManager = Manager(
            configuration: NSURLSessionConfiguration.defaultSessionConfiguration()
        )
    }
}
like image 453
yasin Avatar asked Sep 21 '16 19:09

yasin


1 Answers

I've migrated your code to Swift 3 and Alamofire 4 and here it's a result :

internal typealias RequestCompletion = (Int?, Error?) -> ()?
private var completionBlock: RequestCompletion!
var afManager : SessionManager!


func makeAlamofireRequest(url :String){
    let configuration = URLSessionConfiguration.default

    afManager = Alamofire.SessionManager(configuration: configuration)
    afManager.request(url, method: .post).validate().responseJSON {
                response in
                switch (response.result) {
                case .success:
                    print("data - > \n    \(response.data?.debugDescription) \n")
                    print("response - >\n    \(response.response?.debugDescription) \n")
                    var statusCode = 0
                    if let unwrappedResponse = response.response {
                        let statusCode = unwrappedResponse.statusCode
                    }
                    self.completionBlock(statusCode, nil)

                    break
                case .failure(let error):
                    print("error - > \n    \(error.localizedDescription) \n")
                    let statusCode = response.response?.statusCode
                    self.completionBlock?(statusCode, error)
                    break
                }
            }
}

Some notes about code:

In Alamofire 4.0 you don't need to manually validate between codes 200..300. validate() method do it automatically.

Documentation :

Automatically validates status code within 200...299 range, and that the Content-Type header of the response matches the Accept header of the request if one is provided.

You can use response parameter in responseJSON method. It contains all information that you need in your code.

About request method

open func request(_ url: URLConvertible, method: HTTPMethod = .get, parameters: Parameters? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: HTTPHeaders? = nil) -> DataRequest

All parameters except URL, are initially nil or has a default value. So it's no problem to add parameters or headers to your request.

Hope it helps you

like image 81
kamwysoc Avatar answered Sep 28 '22 17:09

kamwysoc