2010-06-02 9 views
8

MSDN sitesinde, POST'ed verileriyle web isteği nasıl yapılacağını gösteren bir example of some C# code vardır. Satır (*) işaretliC# web sorgusu POST kodlama sorusuyla

WebRequest request = WebRequest.Create ("http://www.contoso.com/PostAccepter.aspx "); 
request.Method = "POST"; 
string postData = "This is a test that posts this string to a Web server."; 
byte[] byteArray = Encoding.UTF8.GetBytes (postData); // (*) 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = byteArray.Length; 
Stream dataStream = request.GetRequestStream(); 
dataStream.Write (byteArray, 0, byteArray.Length); 
dataStream.Close(); 
WebResponse response = request.GetResponse(); 
...more... 

Kafamı kurcalayan satırda: İşte o kodun bir alıntıdır. Veriler UTF8 yerine UrlEncode yöntemi kullanılarak kodlanmamalıdır? application/x-www-form-urlencoded'un anlamı nedir?

cevap

11

ContentType, application/x-www-form-urlencoded olarak ayarlandığından, ancak asıl içerik düz metin olduğundan örnek kod yanıltıcıdır. application/x-www-form-urlencoded bir dize şu şekildedir:

name1=value1&name2=value2 

UrlEncode fonksiyonu '&' ve '=' öylesine bir ayrıştırıcı sözdizimi olarak dikkate almaz gibi özel karakterlerden kurtulmak için kullanılır. Bir dize (medya tipi metin/düz) alır ve bir dize döndürür (ortam tipi uygulama/x-www-form-urlencoded).

Encoding.UTF8.GetBytes, WebRequest API'sinin beklediği bir dizi bayt dizisine (durumumuzdaki/x-www-form-urlencoded ortam türü uygulaması) dizgeye dönüştürmek için kullanılır.

+0

application/x-www-form-urlencoded Can olmayan ASCII karakterleri şunlardır:

Bu sayfa yardımcı oldu? Bunu hayır demek için yorumladım. http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1 veya yanlış anladım mı? –

+0

Martin Smith'in belirttiği gibi, “application/x-www-form-urlencoded”, içeriğin belirli bir şekilde kodlandığını gösterir. Encoding.UTF8 bunu nasıl kullanır? – rlandster

+0

@Martin Smith: Bilmiyor. Sadece isimleri ve değerleri kodlamak için UrlEncode işlevini kullanın ve iyi olmalısınız. Ben örnek UTF8 kullanır düşünüyorum çünkü bu C# cinsinden gerçek dizeleridir. –

9

Max Toro'nun belirttiği gibi, MSDN sitesindeki örnekler yanlıştır: doğru bir form POST, verilerin kodlanmış URL olmasını gerektirir; MSDN örneğindeki veriler kodlama ile değiştirilecek herhangi bir karakter içermediğinden, bir anlamda zaten kodlanmışlardır.

Doğru kod, name1=value1&name2=value2 dizgisiyle birleştirmeden önce her ad/değer çiftinin isimleri ve değerleriyle ilgili System.Web.HttpUtility.UrlEncode numaralı çağrıya sahip olacaktır. http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx