Отправить массив в качестве параметра в запросе 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 выдал исключение, которое не было отправлено обратно как ошибка.

все остальные ответы правильные, я проверил их после нахождения проблемы, и все сработало, поэтому я собираюсь проголосовать за них.

большое спасибо.