Создание динамической веб-страницы, которая включает в себя действие JavaScript POST - PullRequest
0 голосов
/ 21 января 2019

Я строю рабочий процесс автоматизации (vRA), который включает в себя условия обслуживания электронной почты.Если клиенту нужен общий диск, он должен принять TOS, прежде чем диск будет создан автоматически.

Суть рабочего процесса - Пользовательское событие внутри vRO, которое ожидает POST-запроса.Это работает с POSTMAN, проблема, с которой я продолжаю сталкиваться, это ссылка на веб-страницу, которая будет выполнять POST.

Я пытаюсь создать веб-страницу, которая будет просто POST к этому настраиваемому событию, на страницу будет встроен токен Auth, срок действия которого истечет через 10 минут.

После завершения того, что я думал, будетбыть трудной работой, которую я оставил, почесывая голову, потому что одна за другой мои попытки заставить это работать не увенчались успехом.

def createwebpage(customevent, token):
   #Create javascript based webpage
   customevent = unicode(customevent, "utf-8")
   url = "https://automationserver/vco/api/customevent/" + customevent
   authtoken = "'Bearer ,Bearer " + token + "',"
   webpage = ("<html>\n" +
            "<head>\n" +
            "<script type=\"text/javascript\">\n" +
            "console.log(\"This is a test...\");\n" +
            "async function userAction() {\n" +
              "const URL = '" + url + "';\n"
              "fetchInit = {\n" +
                "method: 'POST',\n" +
                "mode: 'no-cors',\n" +
                "credentials: 'include',\n" +
                "body: '{\"executionId\": \"\",\"parameters\": [],\"profilerOptions\": {\"enabled\": true}',\n" +
                "headers: {\n" +
                    "'Content-Type': 'application/json',\n" +
                    "'Authorization': " + authtoken + "\n" +
                    "'cache-control': 'no-cache',\n" +
                    "'Accept': 'application/json'\n" +
                  "}\n" +
                "};\n" +
              "try {\n" +
                  "const fetchResult = fetch(\n" +
                  "new Request(URL, fetchInit));\n" +
                  "console.log(\"Completed request\");\n" +
                  "document.write(\"<b>Drive has been created...</b>\");\n" +
                "} catch (e) {\n" +
                "  throw Error(e);\n" +
                "}\n" +
              "};\n" +
          "</script>\n" +
        "</head>\n" +
          "<body>\n" +
              "<b>The shared drive located at CO - CO Test CANNOT be used to store - HIPPA / PCI information!!</b>\n" +
              "<br>\n" +
              "<b>By clicking Accept below you acknowledge no HIPPA / PCI information will be stored within the contents of files</b>\n" +
              "<br>\n" +
              "<br>\n" +
              "<form>\n" +
                "<button type=\"submit\" onclick=\"userAction()\">Accept</button>\n" +
              "</form>\n" +
            "</div>\n" +
          "</body>\n" +
        "</html>\n")
   #Write to file
   filename = '/tmp/web/' + customevent + ".html"
   with open(filename, 'w') as f:
      f.write(webpage)

Веб-страница, которую генерирует этот код Python, выглядит следующим образом.

<html>
<head>
<script type="text/javascript">
console.log("This is a test...");
async function userAction() {
const URL = 'https://automationserver/vco/api/customevent/58a4a5c2-160b-4d3f-bec9-7b7071cd6b0e';
fetchInit = {
method: 'POST',
mode: 'no-cors',
credentials: 'include',
body: '{"executionId": "","parameters": [],"profilerOptions": {"enabled": true}',
headers: {
'Content-Type': 'application/json',
'Authorization': 'token',
'cache-control': 'no-cache',
'Accept': 'application/json'
}
};
try {
const fetchResult = fetch(
new Request(URL, fetchInit));
console.log("Completed request");
document.write("<b>Drive has been created...</b>");
} catch (e) {
  throw Error(e);
}
};
</script>
</head>
<body>
<b>The shared drive located at CO - CO Test CANNOT be used to store - HIPPA / PCI information!!</b>
<br>
<b>By clicking Accept below you acknowledge no HIPPA / PCI information will be stored within the contents of files</b>
<br>
<br>
<form>
<button type="submit" onclick="userAction()">Accept</button>
</form>
</div>
</body>
</html>

Как примечание, я уже включил три системы в этот рабочий процесс автоматизации - я понимаю, что предложение состоит в том, чтобы удалить no-cors и подчиниться прокси (почему я нене знаю - это кажется глупым) но хотелось бы избежать создания еще одной зависимости.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Ответ Эндрю Диббла помог мне справиться, но я начал получать следующую ошибку после включения ее в Firefox (работал в Chrome).

TypeError: NetworkError javascript fetch

Это было решено удалением формы из тела HTML. Кто-то, более знакомый с тонкостями javascript, возможно, сможет объяснить.

Финальный код, который позволил POST.

<html>
<head>
<script type='text/javascript'>
function postData(url = ``, data = {}) {
  return fetch('https://automationserver/vco/api/customevent/event-code', {
  "method": "POST",
  "mode": "no-cors",
  "cache": "no-cache",
  "credentials": "include", // include, *same-origin, omit
  "headers": {
    "Content-Type": "application/json",
    "Authorization": 'token-here',
    "cache-control": "no-cache",
    "Accept": "application/json",
  },
  "redirect": "follow",
  "referrer": "no-referrer",
  "body": JSON.stringify(data)
})
.then(response => response.json());
}
</script>
</head>
<body>
<b>The shared drive CANNOT be used to store - HIPPA / PCI information!!</b>
<br>
<b>By clicking Accept below you acknowledge no HIPPA / PCI information will be stored within the contents of files</b>
<br>
<br>
<button type="submit" onclick="postData()">Accept</button>
</div>
</body>
</html>
0 голосов
/ 22 января 2019

Похоже, вы неправильно используете Fetch API.

Я переписал функцию userAction с тем, что, как мне кажется, будет рабочим кодом.Важно отметить, что fetch выдаст ошибку, только если обнаружит ошибку при выполнении HTTP-запроса.Если ответ на этот запрос 400 или 500, он обработает запрос как успешный.

К вашему сведению, этот код, вероятно, не будет работать ни в одной версии Internet Explorer.Так что если у вас есть пользователи в IE, это не будет работать.Вам нужно будет использовать XMLHttpRequest или получить стороннюю зависимость через CDN для обработки сетевого запроса для вас.

function userAction() {
  const URL = 'https://automationserver/vco/api/customevent/58a4a5c2-160b-4d3f-bec9-7b7071cd6b0e';
  fetchInit = {
    method: 'POST',
    mode: 'no-cors',
    credentials: 'include',
    body: '{"executionId": "","parameters": [],"profilerOptions": {"enabled": true}',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'token',
      'cache-control': 'no-cache',
      'Accept': 'application/json',
    },
  };

  return fetch(URL, fetchInit)
    .then((response) => {
      if (response.status === 200) {
        console.log("Completed request");
        document.write("<b>Drive has been created...</b>");
      } else {
        console.log('Non 200 response:');
        console.log(response.status, response.statusText);
      }
    })
    .catch((err) => {
      console.log('Encountered error:');
      console.log(err);
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...