Як прочитати параметри запиту на публікацію за допомогою JavaScript


92

Я намагаюся прочитати параметри запиту на публікацію з мого HTML. Я можу прочитати параметри запиту отримання, використовуючи наступний код у JavaScript.

$wnd.location.search

Але це не працює для запиту на пост. Хто-небудь може сказати мені, як читати значення параметрів запиту на публікацію в моєму HTML за допомогою JavaScript?

Відповіді:


184

Дані POST - це дані, які обробляються на стороні сервера . І Javascript стоїть на стороні клієнта. Отже, жодним чином ви не можете прочитати дані публікації за допомогою JavaScript.


69
Незважаючи на те, що висновок правильний (ви не можете отримати ці дані з javascript), міркування хибне. Клієнт (браузер) - це той, хто спочатку надсилає дані POST на сервер. Отже, клієнт добре знає, що це за дані. Фактична причина полягає в тому, що браузер не робить ці дані доступними для JavaScript (але цілком міг).
GetFree

@GetFree: Яка користь від так званого знання змінних POST веб-розробнику? Жоден веб-розробник не буде писати сценарій на стороні клієнта, спроектований у браузері, можливо, роблячи дані публікації доступними для JavaScript, оскільки, як ви зазначаєте, це ніколи не відбувається на практиці . Таким чином, у реальному світі відповідь, представлена ​​тут, є правильною, як і моя власна.
Platinum Azure

34
@PlatinumAzure, я не впевнений, що ти розумієш суть справи. Ви говорите, що дані POST існують на сервері, і оскільки javascript працює в клієнті, JS не може отримати доступ до цих даних. Це неправильно, дані POST існують як у клієнта, так і на сервері, і причина, через яку JS не може отримати доступ до цих даних, полягає лише в тому, що клієнт (браузер) не робить їх доступними для JS. Так просто.
GetFree

13
@PlatinumAzure, так, це неможливо зробити з будь-якої причини. Але якщо ви збираєтеся пояснити, що це за причина, переконайтеся, що це правильна причина. Ви пояснюєте, чому це неможливо, помилково, в цьому суть.
GetFree

10
Оскільки браузери отримують такі речі, як веб-програми, програми, які працюють (часто) на 100 відсотків у браузері (жоден сервер, крім хостингових файлів), стане природною потребою мати можливість отримувати більші шматки даних. Існує обмеження на розмір рядка запиту (метод GET) (думаю, 4K), тому можливість читання більших шматків розміщених даних з javascript буде чудовою ідеєю IMHO.
Netsi1964

26

Маленький шматок PHP, щоб сервер заповнив змінну JavaScript, швидко і легко:

var my_javascript_variable = <?php echo json_encode($_POST['my_post'] ?? null) ?>;

Тоді просто перейдіть до змінної JavaScript звичайним способом.

Зауважте, що немає жодних гарантій, що будь-які дані чи вид даних будуть опубліковані, якщо ви не встановите прапорець.


12
Будьте обережні, щоб уникнути / додати лапки / тощо. до ваших даних POST, якщо ви йдете цим маршрутом. Альтернативою є використання json_encode (), який буде працювати практично для будь-якого типу даних. Приклад: abeautifulsite.net/passing-data-from-php-to-javascript
claviska

Зараз це те, що я називаю нестандартним мисленням.
I.Am.A.Guy

Це найпростіший спосіб зробити це точно. Це спрацювало для мене у wordpress, створивши нову сторінку теми та просто виставивши дані публікації на рівні вікна, наприклад window.my_prefix_post_data = <? Php echo $ _POST ['my_post']?>; а потім легко отримати доступ до даних пошти з будь-якого обсягу. Це не рекомендується для сайтів з великою кількістю конфіденційних даних публікацій, які постійно проходять, але для обсягу нашої сторінки / сайту це чудово працює.
OG Sean

2
це неможливо, може виникнути проблема втечі персонажа.
MathieuAuclair

1
Зламаний, точно. Не використовуйте вищевказаний метод, не виходячи з екрана.
Реджі

10

JavaScript - це мова сценаріїв на стороні клієнта, що означає, що весь код виконується на машині веб-користувача. З іншого боку, змінні POST переходять на сервер і там проживають. Браузери не надають ці змінні середовищу JavaScript, а також будь-який розробник не повинен очікувати, що вони чарівно будуть там.

Оскільки браузер забороняє JavaScript отримувати доступ до даних POST, майже неможливо прочитати змінні POST, якщо зовнішній актор, такий як PHP, не повторює значення POST у змінну сценарію або розширення / аддон, який фіксує значення POST під час передачі. Змінні GET доступні через обхідний шлях, оскільки вони знаходяться в URL-адресі, яка може бути проаналізована клієнтською машиною.


3
Я категорично не погоджуюся з вашими -1. Ніде в OP не було вказано запитання AJAX, так що залишається відкритою можливість клацання посилань та подання форми, які не виконуються JavaScript. Останнє, зокрема, є прикладом, коли змінні POST існують, але недоступні на стороні клієнта, якщо тільки відповідь сервера не генерується сценарієм і сценарій не вирішить відлунити значення змінних POST у код JS. Якби я міг -1 ваш коментар, я б.
Platinum Azure

2
Я вже не кажу про AJAX. Мій аргумент стосується будь-якої форми запиту POST. Браузер знає кожен параметр, надісланий як частина запиту HTTP, що включає, серед іншого, URL-адресу та параметри POST. Деякі з цих параметрів стають доступними для JavaScript, інші - ні. Це просто обмеження, накладене браузером, цілком може надати доступ до параметрів POST від JS, але це не так, це проста істина.
GetFree

1
Ви не розумієте моєї думки. Ніхто не буде писати JavaScript, очікуючи, що змінні POST будуть доступні, якщо сервер явно їх не надає. Якщо сервер їх не надає, то, що стосується веб-розробника, що пише код JavaScript, вони можуть взагалі не бути на стороні клієнта.
Platinum Azure

3
Моє пояснення було неповним, не помилковим. Я відредагував свою відповідь, щоб навіть ти був щасливим. Якщо ви ні, тоді замість того, щоб давати мені -1 та приховувати коментарі, відредагуйте це самостійно.
Platinum Azure

1
Я мав на увазі, що сервер не виставляє їх клієнтові як дані GET, а навпаки, клієнт може повторно проаналізувати URL-адресу для них. Дані POST, навпаки, не будуть в URL-адресі. Ми раді змінити мову, якщо хочете, але заява не підлягає суперечці.
Platinum Azure

9

Використовуйте sessionStorage!

$(function(){
    $('form').submit{
       document.sessionStorage["form-data"] =  $('this').serialize();
       document.location.href = 'another-page.html';
    }
});

На іншій сторінці.html:

var formData = document.sessionStorage["form-data"];

Посилання на посилання - https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage


Помилка: sumbit.
Alejandro Salamanca Mazuelo

Що робити, якщо запит на публікацію надходить із субдомену або іншого домену? Зачаття зруйновано.
невизначено

Має бутиform.on('submit',function(){document.sessionStorage["form-data"] = $('this').serialize();window.location.href = 'another-page.html';})
Джастін Лю

@ZefirZdravkov Ви можете встановити cookie за допомогою, samesite = Noneі Secureтому chrome дозволяє його використовувати.
Джастін Лю

6

Чому б не використовувати localStorage або будь-який інший спосіб встановити значення, яке ви хочете передати?

Таким чином ви отримаєте доступ до нього з будь-якого місця!

Будь- де я маю на увазі в межах даного домену / контексту


2
чому не просто просте печиво?
jj_

1
Що робити, якщо запит на публікацію надходить із субдомену або іншого домену? Зачаття зруйновано.
невизначено

@ZefirZdravkov, хоча я погоджуюся з вами щодо існування даного обмеження, воно існує завдяки реалізаціям безпеки на основі браузера. Я можу лише уявити безмежний жах, якби це був сценарій "будь-який сайт може читати будь-який інший вміст".
Ian Mbae

@Ian Будь-який сайт може фактично читати будь-який вміст інших користувачів за допомогою CURL або Ajax. Якщо говорити про "localStorage будь-якого іншого сайту", так, так, це було б мерзенно. Я лише кажу, що ця відповідь буде працювати лише в тому випадку, якщо ви отримуєте / надсилаєте запити POST лише до цього домену. Наприклад, запит POST від cloudianos.comне досягає api.cloudianos.comJavaScript, оскільки вони не мають спільного доступу localStorage.
undefined

2

Ви можете прочитати параметр запиту на публікацію за допомогою jQuery-PostCapture ( @ ssut / jQuery-PostCapture ).

Плагін PostCapture складається з деяких хитрощів.

Коли ви натиснете кнопку "Відправити", onsubmitподія буде надіслана.

На той час PostCapture буде серіалізувати дані форми та зберігати їх у html5 localStorage (якщо доступно) або сховище cookie.


Це буде працювати лише для надсилань повідомлень між тим самим доменом (субдомени також не працюватимуть)
undefined

1

POST - це те, що браузер надсилає від клієнта (вашого браузера) на веб-сервер. Дані публікації надсилаються на сервер через заголовки http, і вони доступні лише в кінці сервера або між ними (наприклад, проксі-сервер) від клієнта (вашого браузера) до веб-сервера. Отже, його неможливо обробити із скриптів на стороні клієнта, таких як JavaScript. Вам потрібно обробляти це за допомогою сценаріїв на стороні сервера, таких як CGI, PHP, Java тощо. Якщо вам все одно потрібно писати на JavaScript, вам потрібно мати веб-сервер, який розуміє і виконує JavaScript на вашому сервері, як Node.js


1

Якщо ви працюєте з Java / REST API, обійти це легко. На сторінці JSP ви можете зробити наступне:

    <%
    String action = request.getParameter("action");
    String postData = request.getParameter("dataInput");
    %>
    <script>
        var doAction = "<% out.print(action); %>";
        var postData = "<% out.print(postData); %>";
        window.alert(doAction + " " + postData);
    </script>

1
<script>
<?php
if($_POST) { // Check to make sure params have been sent via POST
  foreach($_POST as $field => $value) { // Go through each POST param and output as JavaScript variable
    $val = json_encode($value); // Escape value
    $vars .= "var $field = $val;\n";
  }
  echo "<script>\n$vars</script>\n";
}
?>
</script>

Або використовуйте його, щоб помістити їх у словник, який функція може отримати:

<script>
<?php
if($_POST) {
  $vars = array();
  foreach($_POST as $field => $value) {
    array_push($vars,"$field:".json_encode($value)); // Push to $vars array so we can just implode() it, escape value
  }
  echo "<script>var post = {".implode(", ",$vars)."}</script>\n"; // Implode array, javascript will interpret as dictionary
}
?>
</script>

Тоді в JavaScript:

var myText = post['text'];

// Or use a function instead if you want to do stuff to it first
function Post(variable) {
  // do stuff to variable before returning...
  var thisVar = post[variable];
  return thisVar;
}

Це лише приклад і не повинен використовуватися для будь-яких конфіденційних даних, таких як пароль тощо. Метод POST існує з певної причини; надійно відправляти дані у серверну систему, щоб це перешкодило меті.

Але якщо вам просто потрібна купа нечутливих даних форми, щоб перейти на наступну сторінку без /page?blah=value&bleh=value&blahbleh=valueвашої URL-адреси, це призведе до більш чистої URL-адреси, і ваш JavaScript може негайно взаємодіяти з вашими даними POST.


1

У мене є простий код, щоб зробити це:

У вашому index.php:

<input id="first_post_data" type="hidden" value="<?= $_POST['first_param']; ?>"/>

У вашому main.js:

let my_first_post_param = $("#first_post_data").val();

Отже, коли ви включите main.js у index.php ( <script type="text/javascript" src="./main.js"></script>), ви зможете отримати значення вашого прихованого вводу, що містить ваші дані публікації.


0

Ви можете 'json_encode', щоб спочатку закодувати ваші змінні повідомлення через PHP. Потім створіть JS-об’єкт (масив) із кодованих JSON змінних повідомлення. Потім використовуйте цикл JavaScript для маніпулювання цими змінними ... Як - у цьому прикладі нижче - для заповнення форми форми HTML:

<script>

    <?php $post_vars_json_encode =  json_encode($this->input->post()); ?>

    // SET POST VALUES OBJECT/ARRAY
    var post_value_Arr = <?php echo $post_vars_json_encode; ?>;// creates a JS object with your post variables
    console.log(post_value_Arr);

    // POPULATE FIELDS BASED ON POST VALUES
    for(var key in post_value_Arr){// Loop post variables array

        if(document.getElementById(key)){// Field Exists
            console.log("found post_value_Arr key form field = "+key);
            document.getElementById(key).value = post_value_Arr[key];
        }
    }


</script>

0

Один із варіантів - встановити файл cookie в PHP.

Наприклад: файл cookie з іменем недійсний, термін $invalidдії якого закінчується через 1 день:

setcookie('invalid', $invalid, time() + 60 * 60 * 24);

Потім прочитайте його в JS (за допомогою плагіна JS Cookie ):

var invalid = Cookies.get('invalid');

if(invalid !== undefined) {
    Cookies.remove('invalid');
}

Тепер ви можете отримати доступ до значення зі invalidзмінної в JavaScript.


0

Це залежить від того, що ви визначаєте як JavaScript. Сьогодні ми насправді маємо JS у серверних програмах, таких як NodeJS. Це саме той самий JavaScript, який ви кодуєте у своєму браузері, за винятком мови сервера. Тож ви можете зробити щось подібне: ( Код Кейсі Чу: https://stackoverflow.com/a/4310087/5698805 )

var qs = require('querystring');

function (request, response) {
    if (request.method == 'POST') {
        var body = '';

        request.on('data', function (data) {
            body += data;

            // Too much POST data, kill the connection!
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6)
                request.connection.destroy();
        });

        request.on('end', function () {
            var post = qs.parse(body);
            // use post['blah'], etc.
        });
    }
}

І звідси використання post['key'] = newVal;тощо ...


-1

Змінні POST доступні лише для браузера, якщо той самий браузер надіслав їх спочатку. Якщо інша форма веб-сайту надсилає через POST на іншу URL-адресу, браузер не побачить надходження даних POST.

САЙТ A: має форму, подану на зовнішню URL-адресу (сайт B), використовуючи POST SITE B: отримає відвідувача, але лише зі змінними GET


-1
function getParameterByName(name, url) {
            if (!url) url = window.location.href;
            name = name.replace(/[\[\]]/g, "\\$&");
            var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
                results = regex.exec(url);
            if (!results) return null;
            if (!results[2]) return '';
            return decodeURIComponent(results[2].replace(/\+/g, " "));
        }
var formObj = document.getElementById("pageID");
formObj.response_order_id.value = getParameterByName("name");

Це змінна GET, OP запитав спеціально про POST var і зазначив, що він вже легко змінює GET.
OG Sean,

-3
$(function(){
    $('form').sumbit{
        $('this').serialize();
    }
});

У jQuery, наведений вище код дасть вам рядок URL-адреси з параметрами POST в URL-адресі. Виділити параметри POST неможливо.

Щоб використовувати jQuery , вам потрібно включити бібліотеку jQuery. Для цього використовуйте наступне:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js" type="text/javascript"></script>

4
Це тільки отримати параметри POST на сторінці , де форма представляється з . Це здається безпечним припущення , що ОП хоче отримати параметри POST на сторінці форма була представлена на . Це неможливо зробити.
John Washam

-3

Ми можемо збирати параметри форми, подані за допомогою POST, з використанням концепції серіалізації .

Спробуйте це:

$('form').serialize(); 

Просто додайте його попередження, він відображає всі параметри, включаючи приховані.


-4
<head><script>var xxx = ${params.xxx}</script></head>

Використовуючи вираз EL $ {param.xxx}, <head>щоб отримати параметри з методу post, і переконайтеся, що файл js включений після, <head>щоб ви могли обробляти параметр, такий як 'xxx' безпосередньо у своєму js-файлі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.