Отправить массив в качестве параметра в запросе Alamofire POST
мое приложение в настоящее время использует AWS API Gateway и Alamofire для доступа к различным лямбда-функциям, которые действуют как мой бэкэнд.
мне нужно отправить массив в качестве одного из параметров в одну из этих конечных точек API, для этого я использую следующий код:
var interests : [String]
interests = globalInterests.map({ (interest) -> String in
return interest.id!
})
// Parameters needed by the API
let parameters: [String: AnyObject] = [
"name" : name,
"lastName" : lastName,
"interests" : interests
]
// Sends POST request to the AWS API
Alamofire.request(.POST, url, parameters: parameters, encoding: .JSON).responseJSON { response in
// Process Response
switch response.result {
case .Success:
print("Sucess")
case .Failure(let error):
print(error)
}
}
но это не работает из-за того, что массив не распознается API, но если я создам "статический" массив
let interests = ["a", "b", "c"]
все работает как положено к.
как я могу исправить эту ситуацию, учитывая, что массив интересов исходит из другой части кода, как я должен его объявить или построить?
другу удалось выполнить это в Android с помощью
ArrayList<String>
EDIT:
печать массива параметров показывает мне это:
["name":test, "interests": <_TtCs21_SwiftDeferredNSArray 0x7b05ac00>( 103, 651, 42), "lastName": test]
5 ответов
AnyObject может представлять только тип класса. В Swift массив и словарь являются struct, а не типом класса на многих других языках. Структура не может быть описана в AnyObject, и именно поэтому любой входит. Кроме класса, любой может использоваться во всех других типах, включая struct и enum.
поэтому, когда мы тип литой массив или словарь, чтобы какой-либо объект ошибка _TtCs21_SwiftDeferredNSArray происходит.Поэтому мы должны любой, а не какой-либо объект.
let parameters: [String: Any] = [
"name" : name,
"lastName" : lastName,
"interests" : interests
]
используя NSJSONSerialization для кодирования JSON, вы можете создать свой собственный NSURLRequest для его использования в Alamofire, вот Swift 3 пример:
//creates the request
var request = URLRequest(url: try! "https://api.website.com/request".asURL())
//some header examples
request.httpMethod = "POST"
request.setValue("Bearer ACCESS_TOKEN_HERE",
forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Accept")
//parameter array
let values = ["value1", "value2", "value3"]
request.httpBody = try! JSONSerialization.data(withJSONObject: values)
//now just use the request with Alamofire
Alamofire.request(request).responseJSON { response in
switch (response.result) {
case .success:
//success code here
case .failure(let error):
//failure code here
}
}
}
проблема в том, что вы только что объявили массив и не инициализировали его. Это делает массив интересов равным нулю, даже если вы пытаетесь вставить данные. Попробуйте написать
var interests = [String]()
вместо
var interests : [String]
давайте ValueArray = ["идентификатор": "имя","пароль":пароль]
pass ValueArray [параметры: ValueArray] также проверьте кодировку, принятую API.
Это оказалось проблемой с дублированными идентификаторами в массиве. Код API выдал исключение, которое не было отправлено обратно как ошибка.
все остальные ответы правильные, я проверил их после нахождения проблемы, и все сработало, поэтому я собираюсь проголосовать за них.
большое спасибо.