2017-01-26 1 views
0

J'essaye d'envoyer une requête put sur mon serveur, mais la réponse que je reçois est bizarre.Swift 3 n'arrive pas à comprendre que mon http ne fonctionne pas

Si j'ajoute que cela postier:

{ 
      "firstName": req.body.firstName, 
      "lastName": req.body.lastName, 
      "email": req.body.email, 
      "role": req.body.role, 
      "birthday": new Date(req.body.birthday), 
      "sex": req.body.sex, 
      "password": pw 
} 

je reçois un 200 de mon serveur. Cependant, dans ma demande Swift je reçois un 500.

Ma méthode Put ressemble à ceci:

func putUser(accessToken: String, refreshToken: String, emailCurrent: String, firstName: String, lastName: String, emailNew: String, 
       role: Int, sex: String, password: String){ 

     print("vi kører putUser med denne accessToken \(accessToken) og refreshToken \(refreshToken)") 

     let urlPath = "http://xxxxxxxxxxxxxx/api/users/user/\(emailCurrent)" 
     let url = NSURL(string: urlPath) 
     let session = URLSession.shared 
     let request = NSMutableURLRequest(url: url as! URL) 
     request.addValue(accessToken, forHTTPHeaderField: "accessToken") 
     request.addValue(refreshToken, forHTTPHeaderField: "refreshToken") 
     request.httpMethod = "PUT" 



     let postString = "firstName=\(firstName)&lastName=\(lastName)&email=\(emailNew)&role=\(role)&birthday=2010-09-08&sex=\(sex)&password=\(password)" 



    // let strinng = "firstName=\(firstName)&lastName=\(lastName)&email\(emailNew)&role=\(role)&birthday=2010-09-08&sex=\(sex)&password=\(password)" 

     print() 
     print() 

     print("Here is postString from putUser: \(postString)") 

     request.httpBody = postString.data(using: String.Encoding.utf8) 



     let task = session.dataTask(with: request as URLRequest, completionHandler: {data, response, error -> Void in 
      print("Task completed \(data) and response is xxxx") 

//   print all info as a string. --- 
         let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
         print("responseString = \(responseString!)") 



     }) 
     task.resume() 

    } 

Les données de réponse que je reçois est comme suit:

Here is postString from putUser: 
firstName=abcd&lastName=bb&[email protected]&role=1&birthday=2010-09-08&sex=female&password=123 
Task completed Optional(169 bytes) and response is xxxx 
responseString = <!DOCTYPE html><html><head><title></title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>Unexpected token f</h1><h2></h2><pre></pre></body></html> 

Je sens qu'il est à cause de mon postString, cependant je ne peux pas voir la différence entre le httpBody dans mon facteur, et celui ci-dessus.

Merci d'avance!

+0

Essayez de faire quelque chose comme ça http://stackoverflow.com/questions/41762597/post-request-in-objective-c-with-lyft-api- access-token # comment70716705_41762597 Parce que vous formatez vos paramètres en mode GET, dans POSTMAN, c'est comme JSON. – Larme

+0

@Larme cela a fonctionné! Je devais juste ajouter request.addValue ("application/json", forHTTPHeaderField: "Content-Type") et votre suggestion a fonctionné. Merci! –

Répondre

0

La façon dont vous avez formaté votre HTTPBody est erronée. Vous devez créer un (NS)Dictionary.
Ensuite, vous pouvez utiliser (NS)JSONSerialization afin de transformer cette (NS)Dictionary en JSON comme (NS)Data. Vous pouvez vérifier le format en appelant le (NS)String(data:encoding:) à ce sujet.

En outre, vous devrez peut-être indiquer au serveur que vous donnez JSON, en ajoutant à l'en-tête « Content-Type »: « application/json ». Nous ajoutons aussi souvent la longueur: "Content-Length": "lengthOfTheParametersData".

Dans Objective-C (je ne l'utilise pas Swift), mais il devrait être facile à traduire:

// paramètres PUT

NSDictionary *putParams = @{@"firstName":@"abcd", 
          @"lastName":@"bb", 
          @"email":@"[email protected]", 
          @"role":@"1", 
          @"birthday":@"2010-09-08", 
          @"sex":@"female", 
          @"password":@"123"}; 
NSData *putData = [NSJSONSerialization dataWithJSONObject:putParams options:0 error:nil]; 
[request setHTTPBody:putData]; 

// tête:

[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
[request setValue:[NSString stringWithFormat:@"%d", [putData length]] forHTTPHeaderField:@"Content-Length"]; 
0

Il me manquait

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

à ma demande. Après que je pourrais écrire ma demande comme ceci:

let urlPath = "http://keebintest-pagh.rhcloud.com/login" 
     let url = NSURL(string: urlPath) 
     let session = URLSession.shared 
     let request = NSMutableURLRequest(url: url as! URL) 
     request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
     request.httpMethod = "POST" 



     let jsonObject: [String: Any] = [ 
      "email": email, 
      "password": password, 


      ]