JSON'u C # içinde WebClient aracılığıyla URL'ye POSTing


89

C # 'a dönüştürmem gereken bazı JavaScript kodum var. JavaScript kodum, oluşturulmuş bir web hizmetine bazı JSON POST'ları gönderiyor. Bu JavaScript kodu iyi çalışıyor ve aşağıdaki gibi görünüyor:

var vm = { k: "1", a: "2", c: "3", v: "4" };
$.ajax({
  url: "http://www.mysite.com/1.0/service/action",
  type: "POST",
  data: JSON.stringify(vm),
  contentType: "application/json;charset=utf-8",
  success: action_Succeeded,
  error: action_Failed
});

function action_Succeeded(r) {
  console.log(r);
}

function log_Failed(r1, r2, r3) {
  alert("fail");
}

Bunu C # 'a nasıl dönüştüreceğimi bulmaya çalışıyorum. Uygulamam .NET 2.0 kullanıyor. Söyleyebileceğim kadarıyla şuna benzer bir şey yapmam gerekiyor:

using (WebClient client = new WebClient())
{
  string json = "?";
  client.UploadString("http://www.mysite.com/1.0/service/action", json);
}

Bu noktada biraz sıkıştım. Nasıl jsongörünmesi gerektiğinden emin değilim . İçerik türünü ayarlamam gerekip gerekmediğinden emin değilim. Eğer yaparsam, bunu nasıl yapacağımdan emin değilim. Ben de gördüm UploadData. Bu yüzden, doğru yöntemi kullanıp kullanmadığımdan bile emin değilim. Bir anlamda verilerimin serileştirilmesi benim sorunum.

Biri bana burada neyi kaçırdığımı söyleyebilir mi?

Teşekkür ederim!

Yanıtlar:


72

İçeriğinizi ayrıştırmak için bir json serileştiriciye ihtiyacınız var, muhtemelen ona zaten sahipsiniz, nasıl talepte bulunacağınızla ilgili ilk sorunuz için bu bir fikir olabilir:

var baseAddress = "http://www.example.com/1.0/service/action";

var http = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
http.Accept = "application/json";
http.ContentType = "application/json";
http.Method = "POST";

string parsedContent = <<PUT HERE YOUR JSON PARSED CONTENT>>;
ASCIIEncoding encoding = new ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(parsedContent);

Stream newStream = http.GetRequestStream();
newStream.Write(bytes, 0, bytes.Length);
newStream.Close();

var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

Umarım yardımcı olur,


1
"parsedContent" nasıl görünmelidir? Ne yazık ki, bu senaryoda JSON'umu manuel olarak oluşturmam gerekiyor. Teşekkür ederim.
Eels Fan

JSON gibi görünebilir mi? Yoksa bir tür özel kodlama yapmam mı gerekiyor?
Eels Fan

@EelsFan genellikle herhangi bir JSON ayrıştırıcısı seçmek için bir sorun değildir, bir .net nesnesini JSON'a ayrıştırmak için her zaman JSON.Net'i kullanabilirsiniz, ancak deneyimlerime göre farklı bir JSON ayrıştırıcı sürümüne sahip bazı bulut hizmetleri vardı ve bazılarını yapmam gerekiyordu. ince ayarlar. Senaryonuz için en iyisini yapın, bu tartışma JSON.Net stackoverflow.com/questions/9573119/…
Jorge Alvarado

5
Neden UTF8 yerine ASCIIEncoding kullanıyorsunuz? Stackoverflow.com/a/9254967/109392 adresine bakın .
korku

2
+1 İlk önce OP'ye benzer kullanmayı denedim WebClientve işe yaramadı. Sonra bu çözümü denedim ve harika çalıştı. Bayt dizisini oluşturmak UTF8Encodingyerine kullanıyordum ASCIIEncodingçünkü ASCII kullanmak için bir neden göremiyorum, bu da mevcut karakterleri kabul edilemez bir şekilde azaltıyor. ASCII'nin karakter kümesinde yalnızca 127 karakter vardır.
korku

197

Soru zaten cevaplandı ancak sanırım daha basit ve soru başlığıyla daha alakalı olan çözümü buldum, işte burada:

var cli = new WebClient();
cli.Headers[HttpRequestHeader.ContentType] = "application/json";
string response = cli.UploadString("http://some/address", "{some:\"json data\"}");

Not: .net uygulamalarının çoğunda, ancak tüm WebClient'te değil , IDisposable, bu yüzden elbette üzerinde 'kullanma' veya 'Atma' yapmak daha iyidir. Ancak bu özel durumda gerçekten gerekli değildir .


1
Ve json'unuzu "okunabilir" yapmak için: (vb.net'te) Dim json = <JSON> {"field1": "value1", "status": "pending", "objField": {"field2": true} } </JSON> .ToString
foxontherock

Peki ya parametreleri bu json dizesine ekliyor?
Tali B.

74

Aşağıdaki örnek, WebClient.UploadString Yöntemi aracılığıyla bir JSON'un nasıl POST yapılacağını gösterir :

var vm = new { k = "1", a = "2", c = "3", v=  "4" };
using (var client = new WebClient())
{
   var dataString = JsonConvert.SerializeObject(vm);
   client.Headers.Add(HttpRequestHeader.ContentType, "application/json");
   client.UploadString(new Uri("http://www.contoso.com/1.0/service/action"), "POST", dataString);
}

Önkoşullar: Json.NET kitaplığı


4
Tamamlanan olayı kullanıyorsanız bunun UploadStringAsync olması gerektiğini düşünüyorum.
Sam Mackrill

Bu yöntemi varsayılan POSTolarak UploadStringörtük olarak kullandığından bağımsız değişkeni atlayabilirsiniz . Ayrıca , geri dönüş client.Headers.Add(HttpRequestHeader.Accept, "application/json");bekliyorsanız eklemek isteyebilirsiniz JSON.
jimasun

WebClient gerçekten IDisposable uyguluyor mu? Birkaç yıl sonra .NET Framework 4.7.1'de çalışıyorum ve görmüyorum.
bubbleking

2
@bubbleking WebClient'te F12'ye tıkladım ve bunun bir Bileşen ve Bileşen IDisposable uyguladığını görüyorumpublic class WebClient : Component public class Component : MarshalByRefObject, IComponent, IDisposable
Lars Persson
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.