20

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()
        )
    }
}
Lucius
  • 2,794
  • 4
  • 20
  • 42
yasin
  • 1,297
  • 3
  • 17
  • 36

1 Answers1

18

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

kamwysoc
  • 6,709
  • 2
  • 34
  • 48
  • 1
    Do you have to re-instantiate the session manager before each request or can you share the same instance between multiple requests? – cbbcloud Jun 21 '17 at 10:12
  • 1
    @cbbcloud You can create one SessionManager and share the same instance in multiple requests. – kamwysoc Jun 21 '17 at 10:16
  • @kamwysoc very good JOB. can you tell me why `.validate().` used ? – Jack Jun 14 '18 at 06:09
  • 1
    @Jack please read documentation https://github.com/Alamofire/Alamofire/blob/0456f5b501f46591a77b4bb6f2e2e2a97d095042/Documentation/Usage.md#automatic-validation – kamwysoc Jun 14 '18 at 06:12
  • (old) SessionManager > (new) Session – Mahmut K. Mar 09 '21 at 18:00