2016-06-26 16 views
0

Ich versuche, eine PUSH HTTP-Anfrage zu machen und bekomme einen Fehler, der beschreibt, dass ich ein JSON-Array und kein JSONObject bereitstellen muss, wie erstelle ich ein Array von meinem einzigen Objekt, ist es möglich damit?JSONObject vs JSONArray Swift

func printdata(){ 
    let myJsonDict: [String:AnyObject] = [ 
      "action": "Websites", 
      "method":"school_webpage", 
      "tid":2, 
      "data":["schoolId":14273], 
      "type":"rpc" 
     ] 
    do{ 
     let jsonObject = try NSJSONSerialization.dataWithJSONObject(myJsonDict, options: NSJSONWritingOptions.PrettyPrinted) 
      HTTPPostJSON("http://wwww.oncoursesystems.com/json.axd/direct/router", data:jsonObject) { (response, error) -> Void in 
       print(response); 
      } 
     } 
     catch{ 

     } 
} 

func HTTPsendRequest(request: NSMutableURLRequest, callback: (String, String?) -> Void) { 
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
     (data, response, error) -> Void in 
      if (error != nil) { 
       callback("", error!.localizedDescription) 
      } else { 
       callback(NSString(data: data!, encoding: NSUTF8StringEncoding)! as String, nil) 
      } 
    } 

    task.resume() 
} 

func HTTPPostJSON(url: String, data: NSData, callback: (String, String?) -> Void) { 

    let request = NSMutableURLRequest(URL: NSURL(string: url)!) 

    request.HTTPMethod = "POST" 
    request.addValue("application/json",forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json",forHTTPHeaderField: "Accept") 
    request.HTTPBody = data 
    HTTPsendRequest(request, callback: callback) 
} 

Mein Methodenaufruf

override func viewDidLoad() { 
    super.viewDidLoad() 
    searchController.searchResultsUpdater = self 
    searchController.hidesNavigationBarDuringPresentation = false 
    searchController.dimsBackgroundDuringPresentation = false 
    searchController.searchBar.sizeToFit() 
    definesPresentationContext = true 
    self.tableView.tableHeaderView = searchController.searchBar 
    names = HtmlController.loadData() as NSArray as! [String] 
    names.removeAtIndex(0) 
    clean() 
    refreshController = UIRefreshControl() 
    refreshController.addTarget(self, action: #selector(WebpageController.refresh(_:)), forControlEvents: UIControlEvents.ValueChanged) 

    self.tableView.addSubview(refreshController) 
    printdata() 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem() 
} 
+0

Ich bin daran interessiert, die Antwort zu diesem, becuase derzeit verwende ich eine Zeichenfolge für den Körper meiner POSTs. Es hat für mich funktioniert, also habe ich mir nicht die Mühe gemacht, etwas anderes zu machen, aber es würde mir nichts ausmachen, meinen zukünftigen Code sauberer zu machen. – Sethmr

+0

'Ich muss ein JSON-Array und kein JSONObject bereitstellen} Hier gibt es einige Verwirrungen im Vokabular: Ein JSON-Objekt ist immer entweder ein Dictionary oder ein Array. :) – Moritz

Antwort

0

Wollen Sie eine POST-Anforderung?

Dies funktioniert für mich:

func HTTPPostJSON(url: String, data: AnyObject, callback: (String, String?) -> Void) { 
    let request = NSMutableURLRequest(URL: NSURL(string: url)!) 
    request.HTTPMethod = "POST" 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept")  
    request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(data, options: []) 
    HTTPsendRequest(request, callback: callback) 
} 

Beachten Sie die Methodensignatur, Ihre Daten als [ "String": ANYOBJECT] passieren und die Serialisierung innerhalb der HTTPPostJSON Methode behandeln. Ich denke, ein Teil von dem, was falsch ist, könnte mit dem Übergeben von formatiertem JSON (bei Verwendung der hübschen Optionen) zusammenhängen.

bearbeiten:

Basierend auf Ihre Kommentare, haben Sie Ihre Druckmethode aktualisiert für die neue Methode Signatur gerecht zu werden? Es sollte etwas in der Art von:

func printdata(){ 
    let myJsonDict: [String:AnyObject] = [ 
     "action": "Websites", 
     "method":"school_webpage", 
     "tid":2, 
     "data":["schoolId":14273], 
     "type":"rpc"] 

    HTTPPostJSON("http://wwww.oncoursesystems.com/json.axd/direct/router", data:myJsonDict) { 
    (response, error) -> Void in 
     print(response); 
    } 
} 
+0

Funktioniert Ihre HTTPPostJSON-Methode im Zusammenhang mit den Methoden, die ich oben habe? Wenn ich Ihre Methode verwende, erhalte ich immer noch den gleichen Fehler – Praveen

+0

Können Sie zeigen, wie rufen Sie die Methode? –

+0

im Aufruf es in der Ansicht geladen wurde, sehen Sie bitte meine editierten Post – Praveen