2017-01-20 1 views
0

J'ai une application iOS (Objective C) et cette application appelle des binaires C++ en utilisant NodeJs.NodeJS/iOS - Comment obtenir une valeur retournée d'un binaire après l'avoir appelé avec HTTP POST

Jusqu'à présent, je suis en mesure d'exécuter à distance mon programme C++ à partir d'un bouton cliqué sur mon application avec HTTP POST avec la bibliothèque AFNetworking 3.

iOS App -> Bouton clic -> HTTP POST - -> Nœud Appel JS -> Appel de programme C++ (ce dernier renvoie true ou false)

Maintenant, j'aimerais obtenir la valeur (True ou False) renvoyée par mon programme. Comment puis je faire ça ?

J'ai déjà utilisé la méthode GET pour obtenir un fichier sur mon serveur mais je ne sais pas s'il est approprié de l'utiliser dans ce cas pour obtenir le résultat retourné par mon programme.

Avez-vous une idée de comment puis-je y parvenir?

Remerciez

+0

requêtes HTTP ont des réponses. Que pensez-vous qu'ils sont pour si ce n'est pas? – OrangeDog

Répondre

1

Pour être en mesure de récupérer la valeur retournée par votre programme C++, vous devez d'abord récupérer le résultat renvoyé de NodeJS.

En supposant que vous utilisez ExpressJS comme serveur HTTP, vous devez implémenter votre point final avec quelque chose comme:

var execFile = require('child_process').execFile; 
var express = require('express'); 
var app = express(); 

app.post('/endpoint', function (req, res) { 
    const child = execFile('my_exe', (error, stdout, stderr) => { 
    if (error) { 
     res.status(500).send('False') 
    } else { 

     if (stdout === 'True') { 
      res.status(200).send('True') 
     } else { 
      res.status(500).send('False') 
     } 
    } 
    }); 
}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!'); 
}); 

Si l'appel a réussi, le serveur répondra True avec le statut 200 et si elle échoue, elle renverra False avec le statut False.

Maintenant, dans votre appel au serveur de l'application iOS, vous pouvez utiliser Alamofire comme:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

NSURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:@"someURL" parameters:@{} error:nil]; 

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
    if (error) { 
     /* Network error*/ 
     NSLog(@"Error: %@", error); 
    } else { 
     NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
     switch (httpResponse.statusCode) { 
      case 200: 
       NSLog(@"Success") 
       /* Code in case of success == Server returned True */ 
      default: 
      /* Code in case of no success == Server returned False */ 
       NSLog(@"Error"); 
     } 

    } 
}]; 
[dataTask resume]; 
+0

Fonctionne de manière réfléchie. Je vous remercie ! J'ai une meilleure compréhension de cela maintenant. Cependant, j'ai dû ajouter manager.responseSerializer = [sérialiseur AFHTTPResponseSerializer]; sinon, il déclenche une exception lorsque le serveur veut obtenir la réponse. "Erreur: Erreur Domaine = com.alamofire.error.serialization.response Code = -1016" Demande échouée: type de contenu inacceptable: text/html " – lilouch