У меня есть приложение для iOS (Objective C), и это приложение вызывает некоторые двоичные файлы C ++ с использованием NodeJ.
До сих пор я смог удаленно выполнить мою программу на C ++ с помощью нажатой кнопки в моем приложении, используя HTTP POST с библиотекой AFNetworking 3.
Приложение iOS -> Нажатие кнопки -> HTTP POST -> Вызов JS узла -> Вызов программы C ++ (последний возвращает true или false)
Теперь я хотел бы получить значение (True или False), возвращаемое моей программой. Как я могу это сделать ?
Я уже использовал метод GET для получения файла на моем сервере, но я не знаю, уместно ли использовать его для этого случая, т.е. получить возвращенный результат моей программы.
У вас есть идея, как мне этого добиться?
Поблагодарить
Чтобы иметь возможность получить значение, возвращаемое вашей программой на C ++, вам необходимо сначала получить возвращенный результат из NodeJS.
Предполагая, что вы используете ExpressJS
как ваш HTTP-сервер, вы должны реализовать свою конечную точку примерно так:
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!');
});
Если вызов выполнен успешно, сервер ответит True
со статусом 200, и если он потерпит неудачу, он вернется False
со статусом False
,
Теперь при вызове на сервер из приложения iOS вы можете использовать Alamofire, например:
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];
Других решений пока нет …