2016-09-04 1 views
0

Je travaille actuellement sur une petite application où j'ai besoin de faire des connexions à certains sites Web afin d'obtenir des informations.NSURLSession.sharedSession(). DataTaskWithRequest ne fonctionne pas

Voici la fonction que j'ai faite, qui satisfait mes besoins 90% du temps.

func requestFunctionOn(url: String) { 
    print(#function + " url: \(url)") 
    let request = NSMutableURLRequest(URL: NSURL(string: url)!) 
    request.HTTPMethod = "POST" 

    NSURLSession.sharedSession().dataTaskWithRequest(request, 
                completionHandler: { 
                 data, response, error in 

                 if error != nil { 
                  print("error=\(error)") 
                  return 
                 } 

                 print("RSC = \((response as! NSHTTPURLResponse).statusCode)") 
                 ............. doing some more useful work ............. 
                }).resume() 
} 

Il ya des moments où j'ai rencontré un problème, sans que je sache pourquoi. Par exemple ci-dessous sont des traces dans la console de débogage d'un cas de travail (RSC = 200) et d'un cas de travail non (RSC = 404):

fonctionne comme prévu:

requestFunctionOn url: http://abcnews.go.com 
RSC = 200 
(lldb) 

ne fonctionne pas comme prévu:

requestFunctionOn url: http://www.bloomberg.com/asia 
RSC = 404 
(lldb) 

Que puis-je faire pour que le second cas fonctionne? Où dois-je regarder?

+0

Etes-vous en train d'écrire ou de recevoir? Essayez 'request.HTTPMethod =" GET "' –

+0

J'essaie d'obtenir le contenu du site Web afin de l'analyser et de lire ce dont j'ai besoin. Comme je l'ai mentionné, cela fonctionne principalement. Dans le premier cas mentionné, je peux le faire. – Michel

+1

@ Leo Dabus: Suite à votre idée, je viens de faire quelques tests. Voici le résultat: Lors de l'utilisation: request.HTTPMethod = "POST"; J'ai les effets mentionnés dans mon post. Lors de l'utilisation: request.HTTPMethod = "GET"; Ça marche. Lorsque vous supprimez simplement la ligne, cela fonctionne également. Je ne comprends pas très bien ce qui se passe. Peut-être que vous pouvez expliquer? Merci pour le conseil dans tous les cas. – Michel

Répondre

0

Deux problèmes:

  • Vous devez définir l'en-tête Content-Type pour indiquer le contenu du corps de requête POST, avec l'équivalent Swift de ceci:

    [request addValue:@"text/plain" forHTTPHeaderField:@"Content-Type"]; 
    
  • Vous avez besoin pour définir le corps de la demande:

    request.HTTPBody = [NSData data]; 
    

Excuses pour les snippets Objective-C, mais je suppose que cela devrait être assez proche pour que vous puissiez comprendre le code Swift équivalent. :-)