How to make parameter encoding in Alamofire 4?

There was a problem with the fact that I came across a parameter encoding in Alamofire 4. Before I use the ParameterEncoding enumeration and do something like this:

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

However, it has since been replaced with the ParameterEncoding protocol :

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

How do I link this to my current code? How to encode the current mutableURLRequest ?

EDIT:

 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 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) } 

When executing the 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 } 
+7
ios swift swift3
source share
3 answers

You can make a simple Alamofire request like this.

 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 }) 

You can see that I used JSONEncoding in this request. You can choose a coding method there from any of them.

In JSONEncoding

  • default

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

  • prettyPrinted

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

And in URLEncoding

  • default -

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

  • methodDependent

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

  • Querystring

  • httpBody

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

And create your own Custom Encoding as follows.

 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 } } 

And you can use MyCusomEncoding in your Alamofire requests.

+14
source share

Use Alamofire.URLEncoding ()

Code example:

// finalRequest: URLRequest? = nil

  do { try finalRequest = Alamofire.URLEncoding().encode(urlRequest as! URLRequestConvertible, with: parameters) } catch { //Handle error } return finalRequest! 
+3
source share
 do { let alamofireRequest = try Alamofire.URLEncoding().encode(urlRequest as URLRequestConvertible, with: parameters) Alamofire.request(alamofireRequest).response { (dataResponse) in } } catch { } 
0
source share

All Articles