2016-04-12 13 views
6

Meine App verwendet derzeit AWS API Gateway und Alamofire, um auf verschiedene Lambda-Funktionen zuzugreifen, die als mein Backend fungieren.Senden eines Arrays als Parameter in einer Alamofire POST-Anforderung

Ich habe die Notwendigkeit, ein Array als einer des Parameters zu einem dieser API Endpunkten zu senden, für die ich den folgenden Code verwenden:

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

Aber das ist nicht wegen des Array arbeiten wird nicht durch die API erkannt zu werden, aber wenn ich eine „statische“ Array

let interests = ["a", "b", "c"] 

Alles funktioniert schaffen, wie es soll.

Wie kann ich diese Situation beheben, da das Array der Interessen von einem anderen Teil des Codes stammt, wie soll ich es deklarieren oder konstruieren?

Ein Freund es geschafft, dies in Android zu erreichen ein

ArrayList<String> 

EDIT:

die Parameter Array Drucken zeigt mir dies:

["name":test, "interests": <_TtCs21_SwiftDeferredNSArray 0x7b05ac00>(103, 651, 42), "lastName": test] 
+0

Was Rückkehr interests.id ist Rückkehr nach! ? – Lion

+2

Ich denke, die "Interessen" sind immer leer und der Code, der Interessen berechnet, ergibt für mich keinen Sinn. Sie haben ein leeres Array deklariert, und Sie versuchen, darüber zu mappen !. Kannst du diesen Teil klären? – Shripada

+0

Bearbeitete die Frage, machte ich Fehler beim Kopieren des Codes. Nach der Map ist das Array nicht leer und ist ein [(String)] mit 3 Werten – ur3k

Antwort

3

AnyObject kann nur den Klassentyp darstellen. In Swift sind Array und Dictionary Struct, anstelle des Klassentyps in vielen anderen Sprachen. Die Struktur kann nicht in AnyObject beschrieben werden, und deshalb kommt Any. Neben der Klasse kann Any auch in allen anderen Typen verwendet werden, einschließlich struct und enum.

Daher immer, wenn wir Cast Array oder Dictionary zu AnyObject _TtCs21_SwiftDeferredNSArray Fehler auftritt.So müssen wir Any anstelle von AnyObject.

let parameters: [String: Any] = [ 
     "name" : name, 
     "lastName" : lastName, 
     "interests" : interests 
    ] 
1

Das Problem ist, dass Sie gerade erklärt das Array und nicht initialisiert es. Das macht das Interesse Array als Null, auch wenn Sie versuchen, die Daten einzufügen. Versuchen Sie das Schreiben

var interests = [String]() 

statt

var interests : [String] 
+0

Ich versuchte dies, aber das Problem bleibt gleich – ur3k

0

lassen Wertarray = [ "Benutzer-ID": Name, "Passwort": Passwort]

Pass Wertarray [Parameter: Wertarray] bestätigen auch die Codierung akzeptiert von der API.

+0

Dies ist in der Tat die Art, wie das Array Parameter erstellt wird, aber das Problem kommt, wenn Sie ein Array als einen dieser Parameter senden , wenn nur mit Saiten gearbeitet wird, ist alles in Ordnung. – ur3k

0

Es stellte sich heraus, dass ein Problem mit doppelten IDs im Array aufgetreten ist. Der Code hinter der API hat eine Ausnahme ausgelöst, die nicht als Fehler zurückgesendet wurde.

Alle anderen Antworten sind korrekt, ich habe sie getestet, nachdem ich das Problem gefunden habe und alles funktioniert, also werde ich sie abstimmen.

Vielen Dank.

+0

Wie haben Sie dieses Problem gelöst? Es ist kein Problem von doppelten Einträgen. Ich bekomme auch das gleiche Ergebnis wie du. '" Menschen ": <_TtCs21_SwiftDeferredNSArray 0x7f7f565d1440> ( 3,)' '. – oyalhi

+0

In meinem Fall war das Problem auf der Serverseite und kein Alamofire-Problem. Ich würde empfehlen, dass Sie eine neue Frage mit mehr Details über das, was vor sich geht, öffnen. – ur3k

11

von NSJSONSerialization mit JSON kodieren, können Sie Ihre eigene NSURLRequest für die Verwendung in Alamofire bauen kann, ist hier ein Swift 3 Beispiel:

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