Created
February 5, 2018 11:18
-
-
Save moaible/d4e4a70f66ceedb752bbbd8f36d9f62c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /// Uses `JSONSerialization` to create a JSON representation of the parameters object, which is set as the body of the | |
| /// request. The `Content-Type` HTTP header field of an encoded request is set to `application/json; charset=utf-8`. | |
| public struct JSONWithUTF8CharsetEncoding: ParameterEncoding { | |
| // MARK: Properties | |
| /// Returns a `JSONEncoding` instance with default writing options. | |
| public static var `default`: JSONEncoding { return JSONEncoding() } | |
| /// Returns a `JSONEncoding` instance with `.prettyPrinted` writing options. | |
| public static var prettyPrinted: JSONEncoding { return JSONEncoding(options: .prettyPrinted) } | |
| /// The options for writing the parameters as JSON data. | |
| public let options: JSONSerialization.WritingOptions | |
| // MARK: Initialization | |
| /// Creates a `JSONEncoding` instance using the specified options. | |
| /// | |
| /// - parameter options: The options for writing the parameters as JSON data. | |
| /// | |
| /// - returns: The new `JSONEncoding` instance. | |
| public init(options: JSONSerialization.WritingOptions = []) { | |
| self.options = options | |
| } | |
| // MARK: Encoding | |
| /// Creates a URL request by encoding parameters and applying them onto an existing request. | |
| /// | |
| /// - parameter urlRequest: The request to have parameters applied. | |
| /// - parameter parameters: The parameters to apply. | |
| /// | |
| /// - throws: An `Error` if the encoding process encounters an error. | |
| /// | |
| /// - returns: The encoded request. | |
| 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 = try JSONSerialization.data(withJSONObject: parameters, options: options) | |
| if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil { | |
| urlRequest.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") | |
| } | |
| urlRequest.httpBody = data | |
| } catch { | |
| throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) | |
| } | |
| return urlRequest | |
| } | |
| /// Creates a URL request by encoding the JSON object and setting the resulting data on the HTTP body. | |
| /// | |
| /// - parameter urlRequest: The request to apply the JSON object to. | |
| /// - parameter jsonObject: The JSON object to apply to the request. | |
| /// | |
| /// - throws: An `Error` if the encoding process encounters an error. | |
| /// | |
| /// - returns: The encoded request. | |
| public func encode(_ urlRequest: URLRequestConvertible, withJSONObject jsonObject: Any? = nil) throws -> URLRequest { | |
| var urlRequest = try urlRequest.asURLRequest() | |
| guard let jsonObject = jsonObject else { return urlRequest } | |
| do { | |
| let data = try JSONSerialization.data(withJSONObject: jsonObject, options: options) | |
| if urlRequest.value(forHTTPHeaderField: "Content-Type") == nil { | |
| urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") | |
| } | |
| urlRequest.httpBody = data | |
| } catch { | |
| throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) | |
| } | |
| return urlRequest | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment