2015-08-13 9 views
44

Ich versuche, eine Post-Anfrage mit einer Leiche in schnellen Alamofire zu machen.So senden Sie eine POST-Anfrage mit BODY in swift

mein json Körper sieht aus wie:

{ 
    "IdQuiz" : 102, 
    "IdUser" : "iosclient", 
    "User" : "iosclient", 
    "List":[ 
     { 
     "IdQuestion" : 5, 
     "IdProposition": 2, 
     "Time" : 32 
     }, 
     { 
     "IdQuestion" : 4, 
     "IdProposition": 3, 
     "Time" : 9 
     } 
    ] 
} 

Ich versuche letlist mit NSDictionnary zu machen, die wie folgt aussehen:

[[Time: 30, IdQuestion: 6510, idProposition: 10], [Time: 30, IdQuestion: 8284, idProposition: 10]] 

und meine Anfrage Alamofire mit wie folgt aussieht:

Alamofire.request(.POST, "http://myserver.com", parameters: ["IdQuiz":"102","IdUser":"iOSclient","User":"iOSClient","List":list ], encoding: .JSON) 
      .response { request, response, data, error in 
      let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding) 
       println(dataString) 
     } 

Die Anfrage hat einen Fehler und ich glaube th Das Problem ist mit Dictionary-Liste, denn wenn ich eine Anfrage ohne die Liste mache, funktioniert es gut, also keine Idee?


Ich habe versucht, die Lösung vorgeschlagen, aber ich bin vor dem gleichen Problem:

let json = ["List":list,"IdQuiz":"102","IdUser":"iOSclient","UserInformation":"iOSClient"] 
     let data = NSJSONSerialization.dataWithJSONObject(json, options: NSJSONWritingOptions.PrettyPrinted,error:nil) 
     let jsons = NSString(data: data!, encoding: NSUTF8StringEncoding) 



    Alamofire.request(.POST, "http://myserver.com", parameters: [:], encoding: .Custom({ 
     (convertible, params) in 
     var mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest 
     mutableRequest.HTTPBody = jsons!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
     return (mutableRequest, nil) 
    })) 
     .response { request, response, data, error in 
     let dataString = NSString(data: data!, encoding:NSUTF8StringEncoding) 
      println(dataString) 
    } 
+3

möglich Duplikat [POST-Anfrage mit einer einfachen Zeichenfolge im Körper mit Alamofire] (http: // Stackoverflow.com/questions/27855319/post-request-mit-einem-einfachen-string-in-body-with-alamofire) –

+1

Danke für Ihren Kommentar, aber die Post Ihre bereitgestellten hilft nicht, und ich versuche nicht zu übergeben eine Schnur als Körper, also können Sie bitte den Pfosten sorgfältig lesen –

+0

@ YasserB. Konvertieren Sie Ihre JSON in eine NSString (es gibt Methode dafür), und verwenden Sie dann den Link von @Bhavin? – Larme

Antwort

55

Sie nah dran sind. Die Formatierung des Parameterwörterbuchs sieht nicht korrekt aus. Sie sollten folgendes versuchen:

let parameters: [String: AnyObject] = [ 
    "IdQuiz" : 102, 
    "IdUser" : "iosclient", 
    "User" : "iosclient", 
    "List": [ 
     [ 
      "IdQuestion" : 5, 
      "IdProposition": 2, 
      "Time" : 32 
     ], 
     [ 
      "IdQuestion" : 4, 
      "IdProposition": 3, 
      "Time" : 9 
     ] 
    ] 
] 

Alamofire.request(.POST, "http://myserver.com", parameters: parameters, encoding: .JSON) 
    .responseJSON { request, response, JSON, error in 
     print(response) 
     print(JSON) 
     print(error) 
    } 

Hoffentlich behebt das Ihr Problem. Wenn nicht, antworten Sie bitte und ich werde meine Antwort entsprechend anpassen.

+0

Wie stelle ich eine Eigenschaft von meinem JSON auf null, da ich "AnyObject" 'nil' nicht zuordnen kann? –

+0

Ich bekomme zusätzliches Argument in Anruf Fehler –

+2

@JaseemAbbas überprüfen Sie Ihre Version von Alamofire, wenn Sie auf v4.0 sind + überprüfen Sie meine Antwort unter –

1

Es gibt einige Änderungen, die ich mitteilen möchte. Sie können ab jetzt auf Anfrage, JSON, Fehler vom Antwortobjekt zugreifen.

 let urlstring = "Add URL String here" 
     let parameters: [String: AnyObject] = [ 
      "IdQuiz" : 102, 
      "IdUser" : "iosclient", 
      "User" : "iosclient", 
      "List": [ 
       [ 
        "IdQuestion" : 5, 
        "IdProposition": 2, 
        "Time" : 32 
       ], 
       [ 
        "IdQuestion" : 4, 
        "IdProposition": 3, 
        "Time" : 9 
       ] 
      ] 
     ] 

     Alamofire.request(.POST, urlstring, parameters: parameters, encoding: .JSON).responseJSON { response in 
      print(response.request) // original URL request 
      print(response.response) // URL response 
      print(response.data)  // server data 
      print(response.result) // result of response serialization 

      if let JSON = response.result.value { 
       print("JSON: \(JSON)") 
      } 
      response.result.error 
     } 
84

Wenn Sie mit Swift 3 und Alamofire v4.0 dann würde die akzeptierte Antwort wie folgt aussehen:

let parameters: [String: Any] = [ 
    "IdQuiz" : 102, 
    "IdUser" : "iosclient", 
    "User" : "iosclient", 
    "List": [ 
     [ 
      "IdQuestion" : 5, 
      "IdProposition": 2, 
      "Time" : 32 
     ], 
     [ 
      "IdQuestion" : 4, 
      "IdProposition": 3, 
      "Time" : 9 
     ] 
    ] 
] 

Alamofire.request("http://myserver.com", method: .post, parameters: parameters, encoding: JSONEncoding.default) 
    .responseJSON { response in 
     print(response) 
    } 
+3

Großartig! Ändern Sie bitte die angenommene Antwort auf diese! :) oder kombinieren Sie es mit dem aktuellen für Alamofire 3 und 4 Lösungen. –

+0

Einverstanden - es ist die explizite Angabe von 'JSONEncoding', um den Typ zu disambiguieren, der es für mich getan hat. –

+0

@Gianni Carlo Ich habe dasselbe wie deine Antwort verwendet, aber in meiner Erfolgsantwort erhalte ich Fehler. – Ramakrishna

3

Xcode 8.x Swift 3.X

Leicht Benutzen;

let params:NSMutableDictionary? = [ 
    "IdQuiz" : 102, 
    "IdUser" : "iosclient", 
    "User" : "iosclient", 
    "List": [ 
     [ 
      "IdQuestion" : 5, 
      "IdProposition": 2, 
      "Time" : 32 
     ], 
     [ 
      "IdQuestion" : 4, 
      "IdProposition": 3, 
      "Time" : 9 
     ] 
    ] 
]; 
      let ulr = NSURL(string:"http://myserver.com" as String) 
      let request = NSMutableURLRequest(url: ulr! as URL) 
      request.httpMethod = "POST" 
      request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
      let data = try! JSONSerialization.data(withJSONObject: params!, options: JSONSerialization.WritingOptions.prettyPrinted) 

      let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 
      if let json = json { 
       print(json) 
      } 
      request.httpBody = json!.data(using: String.Encoding.utf8.rawValue); 


      Alamofire.request(request as! URLRequestConvertible) 
       .responseJSON { response in 
        // do whatever you want here 
        print(response.request) 
        print(response.response) 
        print(response.data) 
        print(response.result) 

      } 
9

Ich mag es nicht eine der anderen Antworten bisher (außer vielleicht die one von SwiftDeveloper), weil sie entweder Sie benötigen, um Ihre JSON deserialisieren, nur für sie wieder serialisiert werden, oder über die Pflege Struktur des JSON selbst. Die korrekte answer wurde von afrodev in einer anderen Frage gepostet. Du solltest gehen und upvote es.

Unten ist nur meine Anpassung, mit einigen kleineren Änderungen (in erster Linie explizite UTF-8 Zeichensatz).

let urlString = "https://example.org/some/api" 
let json = "{\"What\":\"Ever\"}" 

let url = URL(string: urlString)! 
let jsonData = json.data(using: .utf8, allowLossyConversion: false)! 

var request = URLRequest(url: url) 
request.httpMethod = HTTPMethod.post.rawValue 
request.setValue("application/json; charset=UTF-8", forHTTPHeaderField: "Content-Type") 
request.httpBody = jsonData 

Alamofire.request(request).responseJSON { 
    (response) in 

    print(response) 
} 
+0

Danke für die Kredite Mann! – afrodev

+0

Ich stimme zu, dass @ SwiftDeveloper die Antwort besser und (meiner Meinung nach) vollständiger ist als die "richtige", die Sie erwähnen. Aber ich würde zwei Punkte argumentieren. Eine, dass die 'richtige Antwort', die du erwähnst, den Fehler hat, dass 'toJSONString' keine native Methode ist, also ist es im Grunde eine Blackbox, die du implementieren musst. Zwei, die Antwort, die du gibst, stellt eine var 'json' zur Verfügung, die als JSON-String beginnt, realistisch gesehen hat niemand die Parameter auf diese Weise, es sei denn, du konvertierst und speicherst sie lokal auf diese Weise. –

+0

@GianniCarlo 1) es gibt keine "toJSONString" in meiner Antwort, 2) "realistisch hat niemand die Parameter so" - das macht eine Menge Annahmen; Der JSON kann von ganz verschiedenen Teilen der App kommen, die nicht mit der Anfrage in Verbindung stehen und von denen der Netzwerkcode nichts weiß. –

1

Ich habe etwas SwiftDeveloper ‚s Antwort bearbeitet, weil es nicht für mich arbeitet. Ich habe auch die Alamofire-Validierung hinzugefügt.

let body: NSMutableDictionary? = [ 
    "name": "\(nameLabel.text!)", 
    "phone": "\(phoneLabel.text!))"] 

let url = NSURL(string: "http://server.com" as String) 
var request = URLRequest(url: url! as URL) 
request.httpMethod = "POST" 
request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
let data = try! JSONSerialization.data(withJSONObject: body!, options: JSONSerialization.WritingOptions.prettyPrinted) 

let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue) 
if let json = json { 
    print(json) 
} 
request.httpBody = json!.data(using: String.Encoding.utf8.rawValue) 
let alamoRequest = Alamofire.request(request as URLRequestConvertible) 
alamoRequest.validate(statusCode: 200..<300) 
alamoRequest.responseString { response in 

    switch response.result { 
     case .success: 
      ... 
     case .failure(let error): 
      ... 
    } 
} 
-1

{

if Reachability.isConnectedToNetwork() == true 
    { 

     let hud = MBProgressHUD.showAdded(to: self.view, animated: true) 
     hud.mode = .indeterminate 
     hud.label.text = "Loading" 
     hud.animationType = .fade 

     var request = URLRequest(url: URL(string: "http://skandal24.serv.si/ws/webservice/forgot_password")!) 
     request.httpMethod = "POST" 

     let postString = String(format: "email=%@&lang=%@", arguments: [txt_emailVirify.text!, language!]) 
     print(postString) 

     emailString = txt_emailVirify.text! 
     request.httpBody = postString.data(using: .utf8) 
     request.addValue("delta141forceSEAL8PARA9MARCOSBRAHMOS", forHTTPHeaderField: "Authorization") 
     request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 



     Alamofire.request(request).responseJSON { response in 
      //Your code 
      print(response.value) 

      if response.response?.statusCode == 200 
      { 
       let dictionary = (response.value) as! AnyObject 
       let status = dictionary.value(forKey: "status") as! String 
       let sts = Int(status) 
       DispatchQueue.main.async() 
        { 
         if sts == 200 
         { 


         } 
        } 

      } 
      else 
      { 


      } 


     } 


    } 


    else 
    { 

    } 



} 
Verwandte Themen