2016-07-21 5 views
1

Ich habe diese API http://my-api.mydoctorfinder.com/ , die einen Bool-Wert in Abhängigkeit von der E-Mail und Passwort zurückkehren Sie eingegeben haben.Wie POST-Anfrage in Swift

Mein Problem ist, es wird immer falsch zurückgegeben, obwohl die richtige E-Mail-Adresse und das richtige Passwort verwendet werden.

Ich dachte, dass ich nicht den richtigen Parameter gesendet haben könnte, seit ich ein Wörterbuch erstellt habe, das die E-Mail und das Passwort enthält. Dann ging es auf NSJSONSerialization.dataWithJSONObject Methode

By the way, ich SwiftyJson wurde mit.

Dies ist mein Code

//creates a dictionary and calls the PostRequest method 
func attemptLogIn(email: String, password: String) { 
    let route = loggerURL 
    let body: [String:String] = ["email":email, "password":password] 
    makeHTTPPostRequest(route, body: body) 
} 

//performs post request 
private func makeHTTPPostRequest(path: String, body: [String: AnyObject]) { 
    let request = NSMutableURLRequest(URL: NSURL(string: path)!) 

    // Set the method to POST 
    request.HTTPMethod = "POST" 

    do { 
     // Set the POST body for the request 
     let jsonBody = try NSJSONSerialization.dataWithJSONObject(body, options: .PrettyPrinted) 
     request.HTTPBody = jsonBody 
     let session = NSURLSession.sharedSession() 

     let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
      if let jsonData = data { 
       let json:JSON = JSON(data: jsonData) 
       //onCompletion(json, nil) 
       print("The Response: ") 
       print(json) 
      } else { 
       //onCompletion(nil, error) 
       print("The Response: ") 
       print("Hello") 
      } 
     }) 
     task.resume() 
    } catch { 
     // Create your personal error 
     //onCompletion(nil, nil) 
    } 
} 
+0

Ihre API-Dokumentation macht es nicht sofort offensichtlich, ob sie eine 'application/json'-Anfrage oder eine 'application/x-www-form-urlencoded'-Anfrage oder XML oder was auch immer erwartet. (Und nur weil Sie möglicherweise JSON-Antwort generieren, bedeutet dies nicht unbedingt, dass die Anfrage auch JSON ist.) Ihr Code schlägt vor, dass die Anfrage JSON sein sollte, aber wenn ja, sollten Sie Ihren Header "Content-Type" entsprechend einstellen von Josip beschrieben. Übrigens sagst du, dass es "immer [s] falsch zurückgibt". Wie sieht die "Antwort" aus? Der "Fehler"? Wenn das Parsen der JSON fehlgeschlagen ist, was enthalten die 'Daten'? – Rob

Antwort

1

Versuchen prüfen JSON-Objekt erstellen mit NSJSONSerialization in auf diese Weise:

request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(body, options: []) 

Ich nehme an, dass das Problem in .PrettyPrinted Konstante ist.

Edit: Versuchen Sie auch richtige Content-Typ hinzufügen:

request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.addValue("application/json", forHTTPHeaderField: "Accept") 
+1

Gerade die Antwort bearbeitet, seit der Autor Swift 2 verwendet. – Majotron

+0

Wow! dieser arbeitete tatsächlich –

-1
  1. Ihre Schlüssel Überprüfen Sie für E-Mail und Passwort mit den erforderlichen Eingang für APIs
  2. Ihre Login-URL
1

Hier ist die schnelle Post-Anforderung erhalten Daten:

func retriveTextDataByPost(requestURL:String, params: NSDictionary, handler:((dict:NSDictionary?) -> Void)) { 

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil) 

    let url = NSURL(string: requestURL) 
    let request = NSMutableURLRequest(URL: url!, cachePolicy: NSURLRequestCachePolicy.UseProtocolCachePolicy, timeoutInterval: 60) 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    request.addValue("application/json", forHTTPHeaderField: "Accept") 
    request.HTTPMethod = "POST" 

    do { 
     let postData = try NSJSONSerialization.dataWithJSONObject(params, options:NSJSONWritingOptions.PrettyPrinted) 
     request.HTTPBody = postData 

     let postDataTask = session.dataTaskWithRequest(request) { (data:NSData?, response:NSURLResponse?, error:NSError?) -> Void in 

      if data != nil { 

       do { 

        let dictResult:NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 
        handler(dict: dictResult) 

       } catch { } 
      } 
     } 
     postDataTask.resume() 

    } catch { } 
} 
2

Die Antwort ist einfach ein richtig oder falsch, dh es ist nicht ein JSON-Objekt. Also ich würde vorschlagen, nicht Swifty Sohn stattdessen Alamofire verwenden.

folgenden Code sollte für Sie arbeiten: -

let myParameters = [ 
    "email": "your email id", 
    "password": "your password"] 

Alamofire.request(.POST, "http://my-api.mydoctorfinder.com/ ", parameters: myParameters) 
     .response { request, response, data, error in 
       print(request) 
       print(response) 
if(response == true) 
{ 
// do your thing 
} 
       print(error) 
      } 

Hinweis: Es könnte erforderlich sein Antwort

Auch in bool typisieren Folgenden ist der Screenshot der Link, den Sie gab, gibt sie true (und Objekt kein json) [nach der Anmeldung habe ich versucht, mit gleichen Zugangsdaten einzuloggen]

enter image description here

+0

Ich habe nur ein Problem, auch nach der Installation von Alamofire durch Cocoapods konnte ich es immer noch nicht importieren. –

+0

Ich habe den Importfehler behoben, aber immer noch der gleiche Mann. Es ist immer falsch. –