NodeJS / iOS - 如何在使用 HTTP POST 调用二进制文件后获取返回值
NodeJS / iOS - How to get a returned value from a binary after calling it with HTTP POST
我有一个 iOS 应用程序 (Objective C),这个应用程序使用 NodeJs 调用一些 C++ 二进制文件。
到目前为止,我已经能够使用 HTTP POST 和库 AFNetworking 3 从我的应用程序上单击的按钮远程执行我的 C++ 程序。
iOS App --> 单击按钮 --> HTTP POST --> Node JS 调用 --> C++ 程序调用(后者 return true or false)
现在,我想获得由我的程序编辑的值(真或假)return。我该怎么做?
我已经使用 GET 方法在我的服务器上获取文件,但我不知道在这种情况下使用它是否合适,即获取我程序的 returned 结果。
你知道我怎样才能做到这一点吗?
感谢
为了能够检索由您的 C++ 程序编辑的值 return,您首先需要从 NodeJS 检索 returned 结果。
假设您使用 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,如果失败,它将 return 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];
我有一个 iOS 应用程序 (Objective C),这个应用程序使用 NodeJs 调用一些 C++ 二进制文件。
到目前为止,我已经能够使用 HTTP POST 和库 AFNetworking 3 从我的应用程序上单击的按钮远程执行我的 C++ 程序。
iOS App --> 单击按钮 --> HTTP POST --> Node JS 调用 --> C++ 程序调用(后者 return true or false)
现在,我想获得由我的程序编辑的值(真或假)return。我该怎么做?
我已经使用 GET 方法在我的服务器上获取文件,但我不知道在这种情况下使用它是否合适,即获取我程序的 returned 结果。
你知道我怎样才能做到这一点吗?
感谢
为了能够检索由您的 C++ 程序编辑的值 return,您首先需要从 NodeJS 检索 returned 结果。
假设您使用 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,如果失败,它将 return 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];