2014-10-31 7 views
6

Я пытаюсь использовать этот код node.js для использования watson api, который находится в ibm cloud bluemix в нашем приложении ios. Может кто-нибудь сказать мне, что делает этот код, и дать нам ответ, как использовать службу watson из нашего приложения.Watson api using node.js

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

ответ

6

Большая часть этого кода требуется для узла и для выполнения в среде 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_req.write(JSON.stringify(questionData)); 

Node является асинхронным, так что ответ обрабатывается в 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.

3

Весь код предназначен для обработки запроса HTTPS на услугу Watson Question and Answer.

Если вы хотите использовать сервис в вашем ИО приложение, которое вы должны:

  1. Изменить код nodejs и добавить возможности API REST.

    Например, вы должны иметь конечную точку, чтобы получить вопросы и вернуть ответы:

    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. Start приложение в bluemix и сохранить URL, то это будет что-то вроде:

    http://my-cool-app.mybluemix.net 
    
  3. Обратитесь к API в http://my-cool-app.mybluemix.net/api/question?question=Watson

Примечания:

Для приложения IOs вы можете использовать AFNetworking.

Вы также должны прочитать ход о вопрос и ответ службы документации here и прочитать об услуге API here