массив в качестве параметров не работает с Alamofire

У меня есть API, в котором мне нужно отправлять данные как объект, поэтому я передаю данные, как показано ниже, и он отлично работает.

["fname" : "First 1", "lname": "Last 1"]

Но для одного из API веб-разработчику нужен API в виде массива, как показано ниже.

[["fname" : "First 1", "lname": "Last 1"]]

Любая идея, что происходит не так?

Ниже приведен код, который у меня есть

parameters = ..... data that I passed as [String : Any] // e.x. ["fname" : "First 1", "lname": "Last 1"]

var finalWebParams : Any

var webParams2 : [[String : Any]] = [[String : Any]]()
if (webserviceFor=="array") {
    webParams = parameters as [String:Any]
    webParams2.append(webParams)
}

if (webserviceFor=="array") {
    finalWebParams = webParams2
} else {
    finalWebParams = webParams
}

print("finalWebParams==\(finalWebParams)")

request(url, method: webMethod, parameters: finalWebParams as? Parameters, encoding: myEncoding, headers: headers)

Для print я получаю результат, как показано ниже, это означает, что я передаю правильные данные, но получаю ошибку 500.

[["fname" : "First 1", "lname": "Last 1"]]

Любая идея, что я делаю неправильно?


Изменить 1

ниже приведена модель, которая нужна веб-разработчику

[
    {
        "fname" : "First 1",
        "lname" : "Last 1"
    }
]

person Fahim Parkar    schedule 27.10.2018    source источник
comment
stackoverflow.com/questions/27026916/ stackoverflow. com/questions/30394112/ ... Насколько я помню, Alamofire сам не управляет параметрами массива. Вы должны сделать это самостоятельно.   -  person Larme    schedule 27.10.2018
comment
@Larme: это то, что я делаю в webParams2. Но все равно есть ошибка...   -  person Fahim Parkar    schedule 27.10.2018
comment
Какой тип контента принимает ваш сервер? в основном принимаются типы содержимого JSON. если это то вы должны написать что-то вроде: var webParams2 : [String : Any] = ["array": array]   -  person Ali Moazenzadeh    schedule 27.10.2018
comment
@AliMoazenzadeh: проверьте Edit 1 того, что нужно веб-разработчику для почтового запроса ...   -  person Fahim Parkar    schedule 27.10.2018


Ответы (1)


Ответ: мне нужно добавить ArrayEncoding, как показано ниже.

var finalWebParams : [String : Any]

var webParams2 : [[String : Any]] = [[String : Any]]()
if (webserviceFor=="array") {
    webParams = parameters as [String:Any]
    webParams2.append(webParams)
}

if (webserviceFor=="array") {
    finalWebParams = webParams2.asParameters()
} else {
    finalWebParams = webParams
}

Теперь добавьте расширение

private let arrayParametersKey = "arrayParametersKey"

/// Extenstion that allows an array be sent as a request parameters
extension Array {
    /// Convert the receiver array to a `Parameters` object.
    func asParameters() -> Parameters {
        return [arrayParametersKey: self]
    }
}


/// Convert the parameters into a json array, and it is added as the request body.
/// The array must be sent as parameters using its `asParameters` method.
struct ArrayEncoding: ParameterEncoding {

    /// The options for writing the parameters as JSON data.
    public let options: JSONSerialization.WritingOptions


    /// Creates a new instance of the encoding using the given options
    ///
    /// - parameter options: The options used to encode the json. Default is `[]`
    ///
    /// - returns: The new instance
    public init(options: JSONSerialization.WritingOptions = []) {
        self.options = options
    }

    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
        var urlRequest = try urlRequest.asURLRequest()

        guard let parameters = parameters,
            let array = parameters[arrayParametersKey] else {
                return urlRequest
        }

        do {
            let data = try JSONSerialization.data(withJSONObject: array, 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
    }
}
person Fahim Parkar    schedule 28.10.2018