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];