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.