我正在尝试使用此node.js代码来使用我们的ios应用程序中的ibm cloud bluemix中的watson api.任何人都可以告诉我这段代码在做什么,并为我们提供如何使用我们的应用程序中的watson服务的答案.
var express = require('express'); var https = require('https'); var url = require('url'); // setup middleware var app = express(); app.use(express.errorHandler()); app.use(express.urlencoded()); // to support URL-encoded bodies app.use(app.router); app.use(express.static(__dirname + '/public')); //setup static public directory app.set('view engine','jade'); app.set('views',__dirname + '/views'); //optional since express defaults to CWD/views // There are many useful environment variables available in process.env. // VCAP_APPLICATION contains useful information about a deployed application. var appInfo = JSON.parse(process.env.VCAP_APPLICATION || "{}"); // TODO: Get application information and use it in your app. // defaults for dev outside bluemix var service_url = '<service_url>'; var service_username = '<service_username>'; var service_password = '<service_password>'; // VCAP_SERVICES contains all the credentials of services bound to // this application. For details of its content,please refer to // the document or sample of each service. if (process.env.VCAP_SERVICES) { console.log('Parsing VCAP_SERVICES'); var services = JSON.parse(process.env.VCAP_SERVICES); //service name,check the VCAP_SERVICES in bluemix to get the name of the services you have var service_name = 'question_and_answer'; if (services[service_name]) { var svc = services[service_name][0].credentials; service_url = svc.url; service_username = svc.username; service_password = svc.password; } else { console.log('The service '+service_name+' is not in the VCAP_SERVICES,did you forget to bind it?'); } } else { console.log('No VCAP_SERVICES found in ENV,using defaults for local development'); } console.log('service_url = ' + service_url); console.log('service_username = ' + service_username); console.log('service_password = ' + new Array(service_password.length).join("X")); var auth = "Basic " + new Buffer(service_username + ":" + service_password).toString("base64"); // render index page app.get('/',function(req,res){ res.render('index'); }); // Handle the form POST containing the question to ask Watson and reply with the answer app.post('/',res){ // Select healthcare as endpoint var parts = url.parse(service_url +'/v1/question/healthcare'); // create the request options to POST our question to Watson var options = { host: parts.hostname,port: parts.port,path: parts.pathname,method: 'POST',headers: { 'Content-Type' :'application/json','Accept':'application/json','X-synctimeout' : '30','Authorization' : auth } }; // Create a request to POST to Watson var watson_req = https.request(options,function(result) { result.setEncoding('utf-8'); var response_string = ''; result.on('data',function(chunk) { response_string += chunk; }); result.on('end',function() { var answers_pipeline = JSON.parse(response_string),answers = answers_pipeline[0]; return res.render('index',{'questionText': req.body.questionText,'answers': answers}) }) }); watson_req.on('error',function(e) { return res.render('index',{'error': e.message}) }); // create the question to Watson var questionData = { 'question': { 'evidenceRequest': { 'items': 5 // the number of anwers },'questionText': req.body.questionText // the question } }; // Set the POST body and send to Watson watson_req.write(JSON.stringify(questionData)); watson_req.end(); }); // The IP address of the Cloud Foundry DEA (Droplet Execution Agent) that hosts this application: var host = (process.env.VCAP_APP_HOST || 'localhost'); // The port on the DEA for communication with the application: var port = (process.env.VCAP_APP_PORT || 3000); // Start server app.listen(port,host);
解决方法
这些代码的大部分是Node需要的,并且在BlueMix环境中执行. VCAP_SERVICES是Bluemix环境变量,可用于获取您感兴趣的给定服务的凭据.在这种情况下,service_name设置为“question_and_answer”以访问问答平台服务.
在Bluemix环境中,您应该有一个问答服务实例和一个应用程序.当应用程序绑定到问答服务时,它会创建服务绑定.服务绑定具有访问服务实例的应用程序凭据.在这种情况下,VCAP_SERVICES包含用于与服务实例进行通信和身份验证的绑定的URL,用户名和密码.
从您的iOS应用程序,您将需要一些东西.首先,您需要一个服务绑定,并且您现在必须在Bluemix中创建它.获得Bluemix中的凭据后,您可以在iOS应用中使用这些凭据.或者您可以在Bluemix上托管应用程序,并让它处理与Watson的通信.
接下来,您需要能够调用问答服务,这是一项RESTful服务.在上面的代码中,变量选项包含将问题发布到Watson服务的必要信息.请注意,从凭证获取的service_url附加了一个额外的路径信息,以使用Watson For Healthcare域.
从那里你可以创建你的问题.变量questionData包含上面代码中的问题. question.questionText属性设置为你想问Watson的问题,比如,“我应该每天服用阿司匹林吗?”.
然后您可以将问题发布到Watson,如下面的代码片段所示:
watson_req.write(JSON.stringify(questionData));
节点是异步的,因此响应在http.request(…)中处理.答案将发回给请求的申请表
result.on('end',function() { var answers_pipeline = JSON.parse(response_string),answers = answers_pipeline[0]; return res.render('index','answers': answers}) })
其余代码是特定于节点的.但我已经概述了iOS应用程序中所需的基础知识.