2016-03-17 2 views
1

J'ai une construction web angulaire dans une application iOS et je veux POST requêtes jusqu'à la couche native avec quelques JSON que je peux utiliser pour créer des fonctionnalités natives. J'utilise le vieux UIWebView (car Angulaire) donc j'utilise un NSURLProtocol pour intercepter la requête. Cela fonctionne et je peux casser au point que la demande entre. Le problème est que je ne peux pas voir le JSON dans la propriété de données à ce stade parce que ce n'est pas la réponse. La requête est toujours dans l'objet config mais je n'ai aucune idée de comment l'attraper.Comment puis-je obtenir des données sur l'objet de config NSURLRequest

Mon code angulaire pour créer le poste est actuellement comme ceci:

var newdata = $.param({ 
      json: JSON.stringify({ 
       name: "Lee" 
      }) 
     }); 

     $http.post(url, newdata) 

et dans ma NSURLProtocol classe j'Intercepter avec succès ce POST dans cette méthode, mais la propriété HTTPBody est nul:

override class func canInitWithRequest(request:NSURLRequest) -> Bool { 

     if (request.URL!.absoluteString as NSString).containsString("request_media_gallery") { 

      if(request.HTTPBody != nil){ 

       let data:NSData = request.HTTPBody! 
       print(data) 
      } 
      return true 
     } 
     return request.URL?.host == "file" 
    } 

Si je débogue cela en chrome, j'obtiens un 405 à cause de CORS mais je peux voir que mon objet request n'a pas de données mais qu'il a un objet config. Voici le journal de la console de Chrome:

console log

Répondre

4

Au moment où une demande d'URL se met à la couche de protocole, IIRC, l'URL système de chargement, il aseptise dans beaucoup de façons. En particulier, si une demande a un objet HTTPBody qui lui est associée, il fait essentiellement ceci:

req.HTTPBodyStream = [NSInputStream inputStreamWithData:req.HTTPBody]; 
req.HTTPBody = nil; 

En conséquence, pour obtenir les données, vous devez lire à partir du HTTPBodyStream, que la demande était à l'origine créé avec un objet NSData ou un flux de corps.

+0

Alors, comment pouvons-nous lire ce NSInputStream? Le mien semble dire "aucun bytes disponible" – Jelle

+1

Annoyingly, les octets ne deviennent réellement disponibles jusqu'à un cycle plus tardif de la boucle d'exécution. Pour gérer la lecture: 1. Définissez-vous en tant que délégué du flux. 2. Planifiez-le dans une boucle d'exécution. 3. Ouvrez le flux. 4. Implémentez les méthodes de délégation de bytes disponibles. 5. Faites votre travail après il dit qu'il y a des octets disponibles. – dgatwood