HTTP Getiriyle Dizi Gönderme


101

HTTP Alma isteği içeren bir Dizi nasıl gönderebilirim?

İsteği göndermek için GWT istemcisini kullanıyorum.


gerçekten, HTML bunu aydınlatmada daha iyidir. <input name="user[name]" /> <input name="user[email]" />bir <form>kapsayıcının içi, tüm tarayıcılarda varsayılan olarak nasıl gönderileceğini tam olarak bilir. girişler `kullanıcı [ad] = SOMETEXT & kullanıcı [e-posta] =SOME@TEXT.com olacak - bu, bir diziye kod çözmeyi işlemek için gerekli olan ana bilgisayar uygulamasıdır
Garet Claborn

Yanıtlar:


156

Bu, hedef sunucunun neyi kabul ettiğine bağlıdır. Bunun için kesin bir standart yok. Ayrıca bkz. Wikipedia: Sorgu dizesi :

Kesin bir standart olmamakla birlikte, çoğu web çerçevesi birden çok değerin tek bir alanla ilişkilendirilmesine izin verir (örneğin field1=value1&field1=value2&field2=value3). [4] [5]

Genel olarak, hedef sunucu Java ( Servlet ) gibi güçlü yazılmış bir programlama dili kullandığında , bunları aynı ada sahip birden çok parametre olarak gönderebilirsiniz. API, genellikle bir dizi olarak birden çok parametre değeri elde etmek için özel bir yöntem sunar.

foo=value1&foo=value2&foo=value3
String[] foo = request.getParameterValues("foo"); // [value1, value2, value3]

request.getParameter("foo")Ayrıca bunun üzerinde çalışacak, ancak yalnızca ilk değer dönersiniz.

String foo = request.getParameter("foo"); // value1

Ayrıca, hedef sunucu PHP veya RoR gibi zayıf yazılmış bir dil kullandığında [], dili tek bir değer yerine bir değer dizisi döndürmeye tetiklemek için parametre adının sonuna küme ayraçları eklemeniz gerekir .

foo[]=value1&foo[]=value2&foo[]=value3
$foo = $_GET["foo"]; // [value1, value2, value3]
echo is_array($foo); // true

Hala kullanıyorsanız foo=value1&foo=value2&foo=value3, o zaman yalnızca ilk değeri döndürür.

$foo = $_GET["foo"]; // value1
echo is_array($foo); // false

foo[]=value1&foo[]=value2&foo[]=value3Bir Java Servlet'e gönderdiğinizde , onları yine de edinebileceğinizi, ancak parantezler dahil tam parametre adını kullanmanız gerektiğini unutmayın.

String[] foo = request.getParameterValues("foo[]"); // [value1, value2, value3]

sunucu nodeJ'leri kullandığında, diziyi foo = [değer1, değer2, değer3] olarak geçirebilirsiniz. Bu hızlı yolu req.query ile elde ettiğinizde, {foo: '[değer1, değer2, değer3]'} alacaksınız. Sadece onu ayrıştırmanız ve kodunuzda bu diziyi kullanmanız gerekir
Akshay Barpute

ne saçma, dil yazmanın bununla hiçbir ilgisi yok
omnomnom

Bu gerçekten de belirtilmemiş. İşte bu yüzden cevap "Genel olarak" diyor. Güçlü yazılmış dillerde, []istek parametresi adlarındaki köşeli ayraç son ekleri , zayıf yazılan dillerdeki gibi yorumlanmaz. Başlangıçta, amaçlanan değişken türünü oluşturabilmek için zayıf yazılmış diller için dahili bir çalışma olarak tanıtıldı. Bunu yapan ilk kişi PHP oldu.
BalusC

Bu genelleme yapmaz. Parantezler, iç içe geçmiş yapıyı başka türlü düz bir sıraya kodlamak için bir Ruby on Rails sıralama kuralıdır . Zope (Python çerçevesi) aynı kullanım durumu için farklı bir şema kullandı . Bu şemalar çoğunlukla AJAX ve JSON tarafından geçersiz kılınmıştır. Dürüst olmak gerekirse, bunun tip sistemlere genelleştirilmesi gerektiği fikri çok uzaktır .
Martijn Pieters

Başka bir deyişle: Sorun, sorgu dizesinin tür bilgisi taşımaması, sorgu dizesini ayrıştıran dilin zayıf yazılması değil. PHP ve Ruby, aynı isim için birden fazla değeri kabul etmek için ek parantez gerektirmez.
Martijn Pieters

191

Bu gönderinin gerçekten eski olduğunu biliyorum, ancak yanıtlamam gerekiyor çünkü BalusC'nin yanıtı doğru olarak işaretlenmiş olsa da, tamamen doğru değil.

Şunun gibi "[]" ekleyerek sorgu yazmalısınız:

foo[]=val1&foo[]=val2&foo[]=val3

6
Bu eski gönderiyi yanıtladığına sevindim! Kesinlikle yardımcı oldu.
Tha Leang

@BalusC yanlış, bu C / C ++ / C # ile mükemmel şekilde çalışıyor (ve java'da çalışabilir). Aynı adların bu şekilde yorumlanmasına neden olan yalnızca Java kullanımınızdır. Cevabınız URI biçimlendirmesinin yanlış kullanılmasıdır
Garet Claborn

@GaretClaborn ne söylemeye çalıştığından emin değil ama bu cevap benim için çalışıyor
FlowUI. SimpleUITesting.com
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.