JavaScript kullanılarak istek gönderme parametreleri nasıl okunur


92

HTML’imden gönderi isteği parametrelerini okumaya çalışıyorum. JavaScript'te aşağıdaki kodu kullanarak get istek parametrelerini okuyabilirim.

$wnd.location.search

Ancak gönderi talebi için çalışmaz. Biri bana JavaScript kullanarak HTML’imdeki gönderi isteği parametre değerlerini nasıl okuyacağımı söyleyebilir mi?

Yanıtlar:


184

POST verileri, sunucu tarafında işlenen verilerdir . Ve Javascript istemci tarafındadır. Dolayısıyla, JavaScript kullanarak bir gönderi verilerini okuyabilmenizin bir yolu yoktur.


69
Sonuç doğru olsa da (bu verileri javascript'ten alamazsınız) mantık yanlıştır. İstemci (tarayıcı), POST verilerini sunucuya ilk etapta gönderendir. Yani müşteri bu verinin ne olduğunu çok iyi biliyor. Asıl sebep, tarayıcının bu verileri javascript için uygun hale getirmemesidir (ama mükemmel bir şekilde yapabilir).
GetFree

@GetFree: POST değişkenlerinin bu sözde bilgisinin bir web geliştiricisine ne faydası var? Hiçbir web geliştiricisi, tarayıcıya dayalı bir istemci tarafı komut dosyası yazmaz, muhtemelen yazı verilerini JavaScript için kullanılabilir kılar, çünkü sizin de belirttiğiniz gibi, pratikte asla olmaz . Bu nedenle, gerçek dünyada , burada sunulan cevap, benimki kadar doğrudur.
Platinum Azure

34
@PlatinumAzure, konuyu anladığından emin değilim. POST verilerinin sunucuda var olduğunu ve javascript istemcide çalıştığından, JS'nin bu verilere erişmesinin bir yolu olmadığını söylüyorsunuz. Bu yanlıştır, POST verileri hem istemcide hem de sunucuda mevcuttur ve JS'nin bu verilere erişememesinin nedeni, istemcinin (tarayıcı) onu JS'de kullanılabilir hale getirmemesidir. Kadar basit.
GetFree

13
@ PlatinumAzure, Evet, her ne sebeple olursa olsun yapılamaz. Ancak bu nedenin ne olduğunu açıklayacaksanız, bunun doğru neden olduğundan emin olun. Bunun neden mümkün olmadığını açıklamanız yanlış, mesele bu.
GetFree

10
Tarayıcılar web uygulamaları, tarayıcıda yüzde 100 çalışan uygulamalar (genellikle) gibi şeyler aldığından (dosyaları barındırmak dışında sunucu yok), daha büyük veri yığınlarını alabilmek doğal bir ihtiyaç haline gelecektir. Sorgu dizesinin boyutunda bir sınır vardır (GET yöntemi) (4K'yı düşünün), bu nedenle javascript'ten daha büyük POSTED veri parçalarını okuma yeteneği IMHO harika bir fikir olacaktır.
Netsi1964

26

Sunucunun bir JavaScript değişkenini doldurmasını sağlamak için küçük bir PHP parçası hızlı ve kolaydır:

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

Ardından JavaScript değişkenine normal şekilde erişin.

Kontrol etmediğiniz sürece verilen herhangi bir verinin veya veri türünün gönderileceğinin garantisi yoktur - tüm giriş alanları öneri niteliğindedir, garanti değildir.


12
Kaçmak / alıntı eklemek / vb. İçin dikkatli olun. Bu rotaya giderseniz POST verilerinize. Bir alternatif, hemen hemen her veri türü için işe yarayacak json_encode () kullanmaktır. Örnek: abeautifulsite.net/passing-data-from-php-to-javascript
claviska

Şimdi buna kutunun dışında düşünme diyorum.
I.Am.A.Guy

Bunu kesinlikle yapmanın en basit yolu budur. Bu benim için wordpress'te yeni bir tema sayfası oluşturarak ve yazı verilerini window.my_prefix_post_data = <? Php echo $ _POST ['my_post']?> Gibi pencere düzeyinde göstererek çalıştı. ve ardından gönderi verilerine herhangi bir kapsamdan kolayca bu şekilde erişilir. Bu, her zaman çok sayıda hassas gönderi verisi olan siteler için önerilmez, ancak sayfamızın / sitemizin kapsamı için harika çalışıyor.
OG Sean

2
bu uygulanabilir değil, karakterden kaçış sorunu olabilir.
MathieuAuclair

1
Kesinlikle hacklendi. Yukarıdaki yöntemi kaçmadan kullanmayın.
reggie

10

JavaScript, istemci tarafı bir kodlama dilidir, yani kodun tamamı web kullanıcısının makinesinde yürütülür. POST değişkenleri ise sunucuya gider ve orada bulunur. Tarayıcılar bu değişkenleri JavaScript ortamına sağlamaz ve hiçbir geliştirici bunların sihirli bir şekilde orada olmasını beklememelidir.

Tarayıcı JavaScript'in POST verilerine erişmesine izin vermediğinden, POST değişkenlerini PHP gibi bir dış aktör olmadan POST değerlerini bir komut dosyası değişkenine veya aktarım sırasında POST değerlerini yakalayan bir uzantı / eklentiye yansıtmadan okumak neredeyse imkansızdır. GET değişkenleri, istemci makine tarafından ayrıştırılabilen URL'de bulundukları için geçici bir çözüm aracılığıyla kullanılabilir.


3
-1 ile kesinlikle katılmıyorum. OP'nin hiçbir yerinde soru AJAX'ı belirtmedi, bu nedenle JavaScript tarafından gerçekleştirilmeyen bağlantı tıklamaları ve form gönderimleri olasılığını açık bırakır. Özellikle sonuncusu, POST değişkenlerinin var olduğu, ancak sunucu yanıtı bir komut dosyası tarafından oluşturulmadığı ve komut dosyası POST değişkenlerinin değerlerini JS koduna yansıtmayı seçmediği sürece istemci tarafında mevcut olmayan bir örnektir. Yorumunuzu -1 yapabilseydim, yapardım.
Platinum Azure

2
AJAX'tan bahsetmiyorum. Benim argümanım herhangi bir POST talebiyle ilgilidir. Tarayıcı, diğerlerinin yanı sıra URL ve POST parametrelerini içeren HTTP isteğinin bir parçası olarak gönderilen her parametreyi bilir. Bu parametrelerin bazıları javascript için sağlanmıştır, bazıları ise değildir. Bu, tarayıcı tarafından uygulanan bir kısıtlamadır, JS'den POST parametrelerine çok iyi bir şekilde erişim sağlayabilir, ancak bu, basit gerçek budur.
GetFree

1
Demek istediğimi anlamıyorsun. Sunucu açıkça sağlamadıkça, hiç kimse POST değişkenlerinin kullanılabilir olmasını bekleyen bir JavaScript yazmayacaktır. Sunucu bunları sağlamazsa, JavaScript kodu yazan bir web geliştiricisi söz konusu olduğunda, bunlar istemci tarafında da olmayabilir.
Platinum Azure

1
Cevabınızda bunun mümkün olmadığını söylüyorsunuz, ki bu doğru. Ama aynı zamanda neden mümkün olmadığını da açıklıyorsunuz. Bu açıklama yanlış. Bu yüzden -1
GetFree

3
Açıklamam eksikti, yanlış değil. Cevabımı sizin bile mutlu olabilmeniz için düzenledim. Değilseniz, bana -1 vermek ve yorumları küçümsemek yerine, kendiniz düzenleyin.
Platinum Azure

9

SessionStorage kullanın!

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

Another-page.html'de:

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

Referans bağlantısı - https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage


Bir yazım hatası: sumbit.
Alejandro Salamanca Mazuelo

Gönderi isteği bir alt etki alanından veya başka bir etki alanından gelirse ne olur? Konsept bozuldu.
tanımlanmamış

O olmalıform.on('submit',function(){document.sessionStorage["form-data"] = $('this').serialize();window.location.href = 'another-page.html';})
Justin Liu

@ZefirZdravkov ile bir çerez ayarlayabilirsiniz samesite = Noneve Secureböylece chrome kullanımına izin verir.
Justin Liu

6

Neden geçmek istediğiniz değeri ayarlamak için localStorage veya başka bir yolu kullanmıyorsunuz?

Bu şekilde ona her yerden erişebilirsiniz!

By yerde Yani verilen alan / bağlamında


2
neden basit bir kurabiye değil?
jj_

1
Gönderi isteği bir alt etki alanından veya başka bir etki alanından gelirse ne olur? Konsept bozuldu.
tanımsız

@ZefirZdravkov, verilen sınırlamanın varlığı konusunda sizinle hemfikir olsam da, tarayıcı tabanlı güvenlik uygulamaları nedeniyle var. Sınırsız dehşeti ancak 'herhangi bir site başka herhangi bir içeriği okuyabilir' senaryosu olsaydı hayal edebilirim.
Ian Mbae

@Ian Herhangi bir site, CURL veya Ajax aracılığıyla başkalarının içeriğini gerçekten okuyabilir. 'Başka herhangi bir sitenin localStorage'ına atıfta bulunuyorsanız, evet, bu iğrenç olur. Tüm söylediğim, bu yanıtın yalnızca POST isteklerini yalnızca bu etki alanına gönderiyorsanız / gönderiyorsanız işe yarayacağıdır. Örneğin, bir POST isteği , aynı şeyi paylaşmadıkları için JavaScript'inin JavaScript'ine cloudianos.comulaşmayacaktır . api.cloudianos.comlocalStorage
tanımsız

2

İstek sonrası parametresini jQuery-PostCapture ( @ ssut / jQuery-PostCapture ) ile okuyabilirsiniz .

PostCapture eklentisi bazı hilelerden oluşur.

Gönder düğmesine tıkladığınızda, onsubmitolay gönderilir.

O sırada PostCapture, form verilerini seri hale getirecek ve html5 localStorage (varsa) veya tanımlama bilgisi depolamasına kaydedilecektir.


Bu, yalnızca aynı etki alanı arasındaki gönderi gönderimleri için işe
tanımsız

1

POST, tarayıcının istemciden (tarayıcınız) web sunucusuna gönderdiği şeydir. Gönderi verileri sunucuya http başlıkları aracılığıyla gönderilir ve yalnızca sunucu ucunda veya istemciden (tarayıcınız) web sunucusuna giden yol (örneğin: bir proxy sunucusu) arasında kullanılabilir. Bu nedenle, JavaScript gibi istemci tarafı komut dosyalarından işlenemez. Bunu CGI, PHP, Java vb. Gibi sunucu tarafı komut dosyaları aracılığıyla işlemeniz gerekir. Hala JavaScript'te yazmanız gerekiyorsa, Node.js gibi sunucunuzda JavaScript'i anlayan ve çalıştıran bir web sunucusuna ihtiyacınız var


1

Bir Java / REST API ile çalışıyorsanız, geçici bir çözüm bulmak kolaydır. JSP sayfasında şunları yapabilirsiniz:

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

Veya bunları bir işlevin alabileceği bir sözlüğe koymak için kullanın:

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

Ardından JavaScript'te:

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;
}

Bu sadece bir örnektir ve için kullanılmamalıdır herhangi bir şifre vb POST yöntemi bir nedeni var gibi hassas verilerin; arka uca güvenli bir şekilde veri göndermek, böylece amacı geçersiz kılar.

Ancak, bir sonraki sayfanıza /page?blah=value&bleh=value&blahbleh=valueurl'niz olmadan gitmek için bir grup hassas olmayan form verisine ihtiyacınız varsa , bu daha temiz bir url sağlar ve JavaScript'iniz POST verilerinizle anında etkileşime girebilir.


1

Bunu yapmak için basit bir kodum var:

İndex.php dosyanızda:

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

Main.js'de:

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

Yani, main.js'yi index.php ( <script type="text/javascript" src="./main.js"></script>) içine dahil ettiğinizde , gönderi verilerinizi içeren gizli girişinizin değerini elde edebilirsiniz.


0

Post değişkenlerinizi ilk önce PHP aracılığıyla kodlamak için 'json_encode' yapabilirsiniz. Ardından, JSON kodlu gönderi değişkenlerinden bir JS nesnesi (dizi) oluşturun. Ardından, bu değişkenleri işlemek için bir JavaScript döngüsü kullanın ... Aşağıdaki örnekte olduğu gibi, bir HTML form formunu doldurmak için:

<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

Seçeneklerden biri, PHP'de bir çerez ayarlamaktır.

Örneğin: 1 gün içinde süresi dolacak olan geçersiz adlı bir çerez $invalid:

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

Sonra tekrar JS'de okuyun ( JS Cookie eklentisini kullanarak ):

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

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

Artık invalidJavaScript'teki değişkendeki değere erişebilirsiniz .


0

JavaScript olarak tanımladığınız şeye bağlıdır. Günümüzde NodeJS gibi sunucu tarafı programlarında aslında JS var. Bir sunucu dili dışında, tarayıcınızda kodladığınız JavaScript ile tamamen aynıdır. Böylece şöyle bir şey yapabilirsiniz: ( Casey Chu'nun kodu: 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.
        });
    }
}

Ve bundan sonra kullanım post['key'] = newVal;vb ...


-1

POST değişkenleri, yalnızca aynı tarayıcı onları ilk etapta gönderdiyse tarayıcı tarafından kullanılabilir. Başka bir web sitesi formu POST yoluyla başka bir URL'ye gönderirse, tarayıcı POST verilerinin geldiğini görmez.

SİTE A: POST SİTESİ B'yi kullanarak harici bir URL'ye (site B) gönderilen bir form var: ziyaretçiyi alacak, ancak yalnızca GET değişkenleri ile


-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");

Bu GET değişkenidir, OP özellikle POST var için sordu ve zaten GET değişkenlerine kolayca sahip olduğunu belirtti.
OG Sean

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

JQuery'de, yukarıdaki kod size URL'de POST parametreleri olan URL dizesini verecektir. POST parametrelerini çıkarmak imkansız değildir.

JQuery'yi kullanmak için jQuery kitaplığını eklemeniz gerekir. Bunun için aşağıdakileri kullanın:

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

4
Bu yalnızca formun gönderildiği sayfadaki POST parametrelerini alır . Bu OP formu sunuldu sayfada POST parametrelerini almak isteyen güvenli bir varsayım gibi görünüyor için . Bunu yapmak imkansız.
John Washam

-3

POST kullanılarak gönderilen form parametrelerini serileştirme konseptini kullanarak toplayabiliriz .

Bunu dene:

$('form').serialize(); 

Sadece uyarıyı ekleyin, gizli dahil tüm parametreleri görüntüler.


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

<head>Bir gönderi yönteminden parametreler almak için EL ifadesi $ {param.xxx} 'i kullanın ve js dosyasının sonradan eklendiğinden emin olun, <head>böylece doğrudan js dosyanızda' xxx 'gibi bir parametreyi işleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.