Функции Alexa Node HTTP (S) POST и GET с сессионным cookie - PullRequest
0 голосов
/ 16 октября 2019

Я создаю навык, который должен отправлять POST-запрос с {user:, password:} во внешний API, извлекать полученный cookie из внешнего API и использовать сеансовый cookie для запросов GET / PUT / POST.

Я бы сначала вызвал GetLogin, чтобы получить cookie, а затем вызвал getRemoteData GET / PUT / POST с этим сеансовым cookie.

только начинает изучать узел, и я действительно застрял ..

Любая помощь была бы супер крутой!

вот что у меня есть:

const GetAPITestHandler = {
  canHandle(handlerInput) {
    return (handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'GetAPITestIntent');
  },
  async handle(handlerInput) {
    let outputSpeech = 'No data received for Timer Overview.';

    await getRemoteDataJar('/api/timers')
      .then((response) => {
        const data = JSON.parse(response);
        outputSpeech = `There are currently ${data.length} timers setup. `;
        for (let i = 0; i < data.length; i++) {
          if (i === 0) {
            //first record
            if(data[i].enable==true){
            outputSpeech = outputSpeech + data[i].name + ' which is enabled and controls ' + data[i].type + ' that runs every ' + data[i].day + ' ,rest: ' + data[i].hour + data[i].minute + data[i].second + 'for a duration of ' + data[i].equipment.duration + ' seconds, '
            } else if (data[i].enable==false) {
            outputSpeech = outputSpeech + data[i].name + ' which is disabled and controls ' + data[i].type + ' that runs every ' + data[i].day + ' ,rest: ' + data[i].hour + data[i].minute + data[i].second + 'for a duration of ' + data[i].equipment.duration + ' seconds, '
            }
          } else if (i === data.length - 1) {
            //last record
            if(data[i].enable==true){
            outputSpeech = outputSpeech + data[i].name + ' which is enabled and controls ' + data[i].type + ' that runs every ' + data[i].day + ' ,rest: ' + data[i].hour + data[i].minute + data[i].second + 'for a duration of ' + data[i].equipment.duration + ' seconds. '
            } else if (data[i].enable==false) {
            outputSpeech = outputSpeech + data[i].name + ' which is disabled and controls ' + data[i].type + ' that runs every ' + data[i].day + ' ,rest: ' + data[i].hour + data[i].minute + data[i].second + 'for a duration of ' + data[i].equipment.duration + ' seconds. '
            }
          } else {
            //middle record(s)
            if(data[i].enable==true){
            outputSpeech = outputSpeech + ' and ' + data[i].name + ' which is enabled and controls ' + data[i].type + ' that runs every ' + data[i].day + ' ,rest: ' + data[i].hour + data[i].minute + data[i].second + 'for a duration of ' + data[i].equipment.duration + ' seconds, '
            } else if (data[i].enable==false) {
            outputSpeech = outputSpeech + ' and '+ data[i].name + ' which is disabled and controls ' + data[i].type + ' that runs every ' + data[i].day + ' ,rest: ' + data[i].hour + data[i].minute + data[i].second + 'for a duration of ' + data[i].equipment.duration + ' seconds, '
            }
          }
        }
      })
      .catch((err) => {
        //set an optional error message here
        //outputSpeech = err.message;
      });

    return handlerInput.responseBuilder
      .speak(outputSpeech)
      .getResponse();

  },
};



const getRemoteDataJar = function (url) {
  return new Promise((resolve, reject) => {
    var logindata = JSON.stringify({user: "password", password: "password"})
    const loginoptions = {
      host: 'externalip:port',
      path: '/auth/signin',
      method: 'POST',
      json: true,
      body: logindata
    }
    const login = http.request(loginoptions, (response) => {
      if (response.statusCode < 200 || response.statusCode > 299) {
        reject(new Error('Failed with status code: ' + response.statusCode));
      }
      const cookie = [];
      response.on('data', (chunk) => cookie.push(chunk));
      response.on('end', () => resolve(cookie.join('')));
    });
    request.on('error', (err) => reject(err))

    const getoptions = {
      host: 'externalip:port',
      path: url,
      method: 'GET',
      header: login.headers
    }
    const request = http.request(getoptions, url, (response) => {
      if (response.statusCode < 200 || response.statusCode > 299) {
        reject(new Error('Failed with status code: ' + response.statusCode));
      }
      const body = [];
      response.on('data', (chunk) => body.push(chunk));
      response.on('end', () => resolve(body.join('')));
    });
    request.on('error', (err) => reject(err))
  })
};
...