[英]Watson api using node.js
我正在尝试使用此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环境变量,可用于获取您感兴趣的给定服务的凭据。 在这种情况下, service_name
设置为“question_and_answer”以访问问答平台服务。
在Bluemix环境中,您应该有一个问答服务实例和一个应用程序。 当应用程序绑定到问答服务时,它会创建服务绑定。 服务绑定具有访问服务实例的应用程序凭据。 在这种情况下, VCAP_SERVICES
包含用于与服务实例进行通信和身份验证的绑定的URL , 用户名和密码 。
从您的iOS应用程序,您将需要一些东西。 首先,您需要一个服务绑定,并且您现在必须在Bluemix中创建它。 获得Bluemix中的凭据后,您可以在iOS应用中使用这些凭据。 或者您可以在Bluemix上托管应用程序,并让它处理与Watson的通信。
接下来,您需要能够调用问答服务,这是一项RESTful服务。 在上面的代码中,变量options
包含将问题发布到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',{'questionText': req.body.questionText, 'answers': answers})
})
其余代码是特定于节点的。 但我已经概述了iOS应用程序中所需的基础知识。
所有代码都是处理对Watson问答服务的HTTPS请求。
如果要在IOs应用程序中使用该服务,则必须:
修改nodejs代码并添加REST API功能。
例如,您应该有一个端点来接收问题并返回答案:
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}); });
在bluemix中启动您的应用并保存URL,它将类似于:
http://my-cool-app.mybluemix.net
在http://my-cool-app.mybluemix.net/api/question?question=Watson
调用您的API
笔记:
对于IOs应用程序,您可以使用AFNetworking 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.