@jjsds

Как обратиться к параметру в квадратных скобках POST запроса?

Я пытаюсь написать приложение в Google app script, которое будет получать post запросы от сервера и сохранять их содержание в таблице.

Я использую метод doPost()

Мой код:
function doPost (e) {
  var tasklist = SpreadsheetApp.openByUrl(моя таблица);
  var tasks = tasklist.getSheetByName(мой лист);

  var dateTime = Utilities.formatDate(new Date(), "GMT+3", "dd.MM.yyy HH:mm:ss");
  var name = e.parameter.orderName;
  tasks.appendRow([dateTime, name]);
  return ContentService.createTextOutput("Успех");
}


Проблема в том, что значение обычных переменных в теле post запроса я получить могу, а переменных имеющих формат key[key2] нет.

Вот пример POST запроса от сервера:
orderName=zxx&payment[sys]=none&payment[systranid]=0&payment[orderid]=1705693330&payment[products][0][name]=Карандашница+Стакан&payment[products][0][quantity]=1&payment[products][0][amount]=790&payment[products][0][price]=790&payment[amount]=790&formid=form189294992&formname=Cart
  • Вопрос задан
  • 848 просмотров
Пригласить эксперта
Ответы на вопрос 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Обратите внимание, что передается x-www-form-urlencoded. При получении аргумента формы вы должны "преобразовать" его к требуемому формату. В вашем случае

const payments = JSON.parse(e.parameter.payments);

Следующий код возвращает первый элемент массива

/**
 *
 * @param {GoogleAppsScript.Events.DoPost} e
 */
function doPost(e) {
  const payments = JSON.parse(e.parameter.payments);
  return ContentService.createTextOutput(JSON.stringify(payments.products[0]));
}


5eb3a269ca4ea797180580.png

Если строка запроса более интересная, то лучше всего использовать сборку для gas из https://github.com/sindresorhus/query-string.

Более простое представление можно взять тут form2json.js

Соответственно, чтобы получить в doPost объект нужно сделать
form2Json(e.postData.contents)

Пример моего приложения
/* global form2Json */
/* exported doPost */
/**
 *
 * @param {GoogleAppsScript.Events.DoPost} e
 */
function doPost(e) {
  // const payments = JSON.parse(e.parameter.payments);
  return ContentService.createTextOutput(
    JSON.stringify(form2Json(e.postData.contents), null, '  ')
  );
}


5eb51b8925e51758421765.png

Обратите внимание, что возвращается не массив, а объект с индексами. Но это не мешает работать

const data = form2Json(contents);
console.log(JSON.stringify(data.payment.products[0]));
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы