Как читать параметры почтового запроса с помощью 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), поэтому возможность читать большие фрагменты POSTED-данных из javascript была бы отличной идеей ИМХО.
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
это не жизнеспособно, может быть проблема с escape-символом.
MathieuAuclair

1
Взломан, конечно. Не используйте вышеуказанный метод без выхода.
reggie

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

1
В своем ответе вы говорите, что это невозможно, и это правильно. Но вы также объясните, почему это невозможно. Это объяснение неверно. Вот почему вы получаете -1
GetFree

3
Мое объяснение было неполным, не ошибочным. Я отредактировал свой ответ, так что даже вы должны быть счастливы. Если нет, то вместо того, чтобы давать мне -1 и ехидные комментарии, отредактируйте его самостоятельно.
Platinum Azure

9

Используйте sessionStorage!

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

На another-page.html:

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

Ссылка для справки - https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage



Что делать, если почтовый запрос приходит с поддомена или другого домена? Зачатие разрушено.
undefined

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

@ZefirZdravkov Вы можете установить печенье с samesite = Noneи Secureтак хром позволяет его использование.
Джастин Лю

6

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

Таким образом, у вас будет доступ к нему откуда угодно!

В любом месте я имею в виду в пределах данного домена / контекста


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

1
Что делать, если почтовый запрос приходит с поддомена или другого домена? Зачатие разрушено.
undefined

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

@Ian Любой сайт может читать любой другой контент через CURL или Ajax. Если говорить о «локальном хранилище любого другого сайта», то да, это было бы отвратительно. Все, что я говорю, это то, что этот ответ будет работать, только если вы получаете / отправляете запросы POST только в этот домен. Например, запрос POST от cloudianos.comне достигнет api.cloudianos.comJavaScript, потому что они не используют один и тот же localStorage.
undefined

2

Вы можете прочитать параметр почтового запроса с помощью jQuery-PostCapture ( @ ssut / jQuery-PostCapture ).

Плагин PostCapture состоит из нескольких уловок.

Когда вы нажимаете кнопку отправки, onsubmitсобытие будет отправлено.

В это время PostCapture будет сериализовать данные формы и сохранить их в локальном хранилище html5 (если доступно) или в хранилище файлов 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.

Например: печенье с именем недействительной со значением $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 и заметил, что у него уже есть переменные 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 на странице форма была представлена на . Это невозможно.
Джон Уошем

-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.