使用node.js的Watson api

我正在尝试使用这个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('/', function(req, 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环境variables。 在这种情况下, service_name设置为“question_and_answer”来访问Question and Answer平台服务。

在您的Bluemix环境中,您应该有一个Question and Answer服务实例和一个应用程序。 当应用程序绑定到“问答”服务时,它将创build一个服务绑定。 服务绑定具有访问服务实例的应用程序凭证。 在这种情况下, VCAP_SERVICES包含用于与服务实例进行通信和validation的绑定的URL用户名密码

从你的iOS应用程序,你将需要一些东西。 首先,您需要一个服务绑定,现在您必须在Bluemix中创build该服务。 一旦您在Bluemix中拥有凭据,那么您可以在iOS应用程序中使用这些凭据。 或者您可以在Bluemix上托pipe一个应用程序,并让它处理与Watson的通信。

接下来,您需要具备调用RESTful服务的问答服务的function。 在上面的代码中,variablesoptions包含将问题发布到Watson服务的必要信息。 请注意,从凭据获取的service_url附加了使用Watson For Healthcare域的其他path信息。

从那里你可以创build你的问题。 variablesquestionData包含上面的代码中的问题。 question.questionText属性设置为你想问沃森的问题,比如“我应该每天服用阿司匹林吗?”。

然后,您可以将问题发布到Watson,如下面的代码片段所示:

 watson_req.write(JSON.stringify(questionData)); 

节点是asynchronous的,所以响应在http.request(...) 。 答案将发回给请求的应用程序

 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}) }) 

其余的代码是特定于节点的。 但是我已经概述了在iOS应用程序中需要的基础知识。

所有的代码是处理对Watson问答服务的HTTPS请求。

如果您想在IO应用程序中使用该服务,则必须:

  1. 修改nodejs代码并添加REST APIfunction。

    例如,您应该有一个端点来接收问题并返回答案:

     app.get('/api/question', function(req, res){ // Call the service with a question and get an array with the answers var answers = watson.question(req.query); // Send the answers and the question to the client in json res.json({answers: answers, question: req.query.question}); }); 
  2. 在bluemix中启动你的应用程序并保存URL,它将是这样的:

      http://my-cool-app.mybluemix.net 
  3. http://my-cool-app.mybluemix.net/api/question?question=Watson调用你的API

笔记:

对于IO应用程序,您可以使用AFNetworking 。

您还应该阅读关于这里的问题和解答服务文档的dynamic,并在这里阅读关于服务API的信息