¿Cómo hacer la encoding de parameters en Alamofire 4?

Me cuesta meterme en la encoding de parameters en Alamofire 4. Antes de utilizar la enumeración ParameterEncoding y hacer algo como esto:

 Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0 

Sin embargo, esto ha sido reemplazado con el protocol ParameterEncoding :

 public typealias Parameters = [String: Any] public protocol ParameterEncoding { func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest } 

¿Cómo podría integrar esto en mi código actual? ¿Cómo mutableURLRequest mi mutableURLRequest actual?

EDITAR:

 static func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, Any>, data:Data?, contentType: ContentType, parameterName: String) -> (URLRequestConvertible, Data) { var urlRequest = URLRequest(url: URL(string: urlString)!) urlRequest.cachePolicy = .reloadIgnoringLocalCacheData urlRequest.httpMethod = Alamofire.HTTPMethod.post.rawValue let boundaryConstant = "multipart-boundary"; let multipartContentType = "multipart/form-data;boundary="+boundaryConstant urlRequest.setValue(multipartContentType, forHTTPHeaderField: "Content-Type") // Create upload data to send var uploadData = Data() if data != nil { // Add multipart data uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!) if contentType == .Image_JPEG { uploadData.append("Content-Disposition: form-data; name=\"\(parameterName)\"; filename=\"file.jpeg\"\r\n".data(using: String.Encoding.utf8)!) uploadData.append("Content-Type: image/jpeg\r\n\r\n".data(using: String.Encoding.utf8)!) } else if contentType == .Audio { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "MMyyyyddsshhmmA" // superset of OP's format let audioFileName = "recording-\(dateFormatter.string(from: Date())).mp4" uploadData.append("Content-Disposition: form-data; name=\"\(parameterName)\"; filename=\"\(audioFileName)\"\r\n".data(using: String.Encoding.utf8)!) uploadData.append("Content-Type: audio/mpeg\r\n\r\n".data(using: String.Encoding.utf8)!) } uploadData.append(data!) } // Add parameters for (key, value) in parameters { uploadData.append("\r\n--\(boundaryConstant)\r\n".data(using: String.Encoding.utf8)!) uploadData.append("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".data(using: String.Encoding.utf8)!) } uploadData.append("\r\n--\(boundaryConstant)--\r\n".data(using: String.Encoding.utf8)!) // return URLRequestConvertible and Data return (urlRequest, uploadData) } 

Al hacer una request:

 let urlRequest = urlRequestWithComponents(urlString: url, parameters: parameters, data: imageData, contentType: .Image_JPEG, parameterName: "question_img") alamoManager.upload(urlRequest.1, with: urlRequest.0).responseObject { (response: DataResponse<CustomResponse>) in //Some code } 

Puede hacer una request simple de Alamofire como esta.

 import Alamofire import AlamofireObjectMapper import ObjectMapper // // Alamofire.request("hello.com", method: .post, parameters: ["name": "alvin"], encoding: JSONEncoding.default, headers: nil).responseObject(completionHandler: { (response : DataResponse<YourModelHere>) in }) 

Puede ver que he usado JSONEncoding en esta request. Puede elegir su forma de codificar allí desde cualquiera de estos.

En JSONEncoding

  1. defecto

    Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding.default)

  2. prettyPrinted

    Alamofire.request("https://httpbin.org/post", method: .post, parameters: parameters, encoding: JSONEncoding. prettyPrinted)

Y en URLEncoding

  1. defecto —

    Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding.default)

  2. método dependiente

    Alamofire.request("https://httpbin.org/get", parameters: parameters, encoding: URLEncoding(destination: .methodDependent))

  3. cadena de consulta

  4. httpbody

    Alamofire.request("https://httpbin.org/post", parameters: parameters, encoding: URLEncoding.httpBody)

Y crea tu propia Custom Encoding como esta.

 public struct MyCusomEncoding: ParameterEncoding { public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { var urlRequest = try urlRequest.asURLRequest() guard let parameters = parameters else { return urlRequest } do { let data = // // Do your custom stuff here, convert your parameters it into JSON, String, Something else or may be encrypted... urlRequest.httpBody = data } catch { throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) } return urlRequest } } 

Y puede usar MyCusomEncoding en sus requestes de Alamofire .

Use Alamofire.URLEncoding ()

Ejemplo de código:

// finalRequest: URLRequest? = nil

  do { try finalRequest = Alamofire.URLEncoding().encode(urlRequest as! URLRequestConvertible, with: parameters) } catch { //Handle error } return finalRequest!