2016-05-30 1 views
1

Comment puis-je utiliser une requête POST avec des paramètres pour obtenir JSON? Je sais comment le faire avec une simple requête GET. L'URL de requête est http://gyminyapp.azurewebsites.net/api/Gym et la requête de paramètre estObtenir des résultats JSON avec demande POST avec les paramètres

{ 
    "SearchCircle": { 
    "Center": { 
     "Latitude": 0, 
     "Longitude": 0 
    }, 
    "Radius": 0 
    }, 
    "City": "string", 
    "ZipCode": 0, 
    "Type": "string" 
} 

Je suis vouloir simplement utiliser la partie du cercle de recherche de ce qui signifie que je peux ignorer la ville et les champs de zipCode. Je dois fournir Latitude/Longitude, que je reçois de l'emplacement actuel de l'utilisateur. Je dois également définir le type sur "rayon".

Pour une requête GET simple utilisant la version GET de ceci, je le fais.

let url = NSURL(string: "http://gyminyapp.azurewebsites.net/api/Gym") 
     let data = NSData(contentsOfURL: url!) 
     do { 
      let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) 
      for gym in json as! [AnyObject] { 
       gyms.append(gym) 
      } 
     } catch { 
      print("Error") 
     } 
+0

Si cela fonctionne avec un GET, pourquoi voulez-vous utiliser un POST? De plus, si vous récupérez des données, GET est le verbe le plus approprié pour cela. – Bigood

+0

Dans mon API, le GET me donne tous les emplacements dans ma base de données. Ce POST me permet de réduire les résultats avec certains critères. – raginggoat

Répondre

2

Ceci est un code de travail, il vous suffit de mettre les valeurs de vos paramètres de demande.

let session = NSURLSession.sharedSession() 
    let url = "http://gyminyapp.azurewebsites.net/api/Gym" 
    let request = NSMutableURLRequest(URL: NSURL(string: url)!) 
    request.HTTPMethod = "POST" 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    let params:[String: AnyObject] = ["Type" : "string","SearchCircle" : ["Radius" : 0, "Center" : ["Latitude" : 0, "Longitude" : 0]]] 
    do{ 
     request.HTTPBody = try NSJSONSerialization.dataWithJSONObject(params, options: NSJSONWritingOptions()) 
     let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in 
      if let response = response { 
       let nsHTTPResponse = response as! NSHTTPURLResponse 
       let statusCode = nsHTTPResponse.statusCode 
       print ("status code = \(statusCode)") 
      } 
      if let error = error { 
       print ("\(error)") 
      } 
      if let data = data { 
       do{ 
       let jsonResponse = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) 
       print ("data = \(jsonResponse)") 
       }catch _ { 
        print ("OOps not good JSON formatted response") 
       } 
      } 
     }) 
     task.resume() 
    }catch _ { 
     print ("Oops something happened buddy") 
    } 

Ensuite, dans le if let data = data que vous auriez besoin pour analyser la réponse. J'ai vérifié la réponse, c'est un tableau formaté JSON.

0

Voici comment je l'ai fait. Juste faire un NSDictionary sur les paramètres et convertir en NSData, j'ai appelé ce postData. Et puis l'habituel, envoyez ce postData comme requestBody

 let parameters = [ 
      "SearchCircle": 
       [ "Center" : 
        ["Latitude" : 0, 
        "Longitude" : 0] ] 
      "Radius" : 0, 
      "City" : "", ... 
      ... and so on 


      ]   ] 
     do 
     { 
      let postData = try NSJSONSerialization.dataWithJSONObject(parameters, options: .PrettyPrinted) 

      let request = NSMutableURLRequest(URL: NSURL(string: "http...")!, 
               cachePolicy: .UseProtocolCachePolicy, 
               timeoutInterval: 10.0) 
      request.HTTPMethod = "POST" 

      request.HTTPBody = postData 

      let session = NSURLSession.sharedSession() 
      let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in 
       if (error != nil) { 
        print(error) 
       } else { 
        let httpResponse = response as? NSHTTPURLResponse 
        print(httpResponse) 
        do { 
         // JSON serialization 
         self.dictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) as! NSDictionary 
         // if any data 
        } 
        catch { 

        } 
       } 
      }) 

      dataTask.resume() 
     } 
     catch { 

     }