2016-04-14 23 views
22

System.Net.Http kullanıyorum, web üzerinde çeşitli örnekler buldum.Bir nesneyi HttpClient.PostAsync'ye nasıl geçirebilirim ve JSON gövdesi olarak serileştiririm?

public static string POST(string resource, string token) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(baseUri); 
     client.DefaultRequestHeaders.Add("token", token); 

     var content = new FormUrlEncodedContent(new[] 
     { 
      new KeyValuePair<string, string>("", "") 
     }); 

     var result = client.PostAsync("", content).Result; 
     string resultContent = result.Content.ReadAsStringAsync().Result; 
     return resultContent; 
    } 
} 

tüm çalışma cezası: Bir POST istek yapmak için bu kodu oluşturmak başardı. Ancak, data adında bir param olan POST yöntemine üçüncü bir parametreyi iletmek istediğimi varsayalım.

object data = new 
{ 
    name = "Foo", 
    category = "article" 
}; 

nasıl olmadan KeyValuePair oluştururum ki: Veri param böyle bir nesnedir? Benim php RestAPI json girişini bekleyin, bu nedenle FormUrlEncodedContentraw json'unu doğru şekilde göndermelidir. Ama bunu Microsoft.Net.Http ile nasıl yapabilirim? Teşekkürler.

+0

sağ (ve uzantısına anonim türün bu içeriğe JSON olarak serileştirilmesini istiyorsunuz)? – CodingGorilla

+0

@CodingGorilla evet anonim bir türüdür. – IlDrugo

cevap

39

sorunuzun kadar düz cevaptır şu şekildedir: PostAsync yöntemi için sayılı imzası şöyledir:

kamu Görev PostAsync (Uri requestUri, HttpContent içeriği)

Yani, süre Eğer tip HttpContent olmalıdır ve anonim türü bu kriterlere uygun olmayan bir objectPostAsync geçebilir. Bununla birlikte, gerçekleştirmek istediğiniz şeyi başarmanın yolları vardır. Öncelikle, JSON için anonim türü seri gerekir, bunun için en yaygın aracı Json.NET olduğunu. Ben ByteArrayContent nesnesi kullanabilirsiniz, ancak kullanabilir veya isterseniz Farklı türde bir yaratabilecek,

var myContent = JsonConvert.SerializeObject(data); 

İleri, bu veri göndermek için bir içerik nesneyi oluşturmak gerekir: Ve bunun için kod hayli abes .

var buffer = System.Text.Encoding.UTF8.GetBytes(myContent); 
var byteContent = new ByteArrayContent(buffer); 

Ardından, API bu JSON olduğunu bildirmek için içerik türünü ayarlamak istiyorum. Bazı bad side effects olabilir burada yapıyoruz gibi .Result özelliği çağıran

var result = client.PostAsync("", byteContent).Result 

bir yan not:

byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 

Sonra formu içerik ile önceki örnekte çok benzer isteğinizi gönderebilirsiniz Ölü kilitleme gibi, bu yüzden buna dikkat etmek istiyorsun.

+0

Tamam, çok açık. Bu cevap için teşekkürler. Sadece bir soru: bir "POST, PUT, DELETE" gerçekleştirildiğinde, genellikle API 'TRUE' döndürür, ben yöntemi 'string' olarak ilan ettim, ama yaptığımda: 'return sonucu;' get HttpResponseMessage'ı dize olarak dönüştür, yöntem bildirimini değiştirmeli miyim? Dize cevabına ihtiyacım var çünkü diğer sınıf yöntemlerinden sonra seri hale getirmem gerekecek. – IlDrugo

+1

Yanıtın gövdesini deserialize etmeniz gerekiyorsa, dizgiyi sorunun içinde ('result.Content.ReadAsStringAsync()' kullanarak) döndürmek muhtemelen iyi olur. Uygulama yapınıza bağlı olarak, konunun türünü (ör. XML veya JSON) belirlemek için üstbilgileri incelemeniz gerekiyorsa, 'İçerik' nesnesini doğrudan döndürmeniz daha iyi olabilir. Ama eğer ** biliyorsanız ** her zaman JSON (ya da başka bir format) geri dönecek, sonra sadece yanıt gövdesini bir dize olarak döndürmeniz yeterli olacaktır. – CodingGorilla

+0

Anladım, teşekkür ederim :) – IlDrugo

6

Bir çiğ dize yerine FormUrlEncodedContent olarak istek vücuttaki verilerinizi geçmeleri gerekiyor. Bunun bir yolu, bir JSON dizeye serialize etmektir:

var json = JsonConvert.SerializeObject(data); 

Şimdi yapmanız gereken tüm post yöntemine dize pass.

var stringContent = new HttpStringContent(json, 
         UnicodeEncoding.Utf8, 
         "application/json"); 

var client = new HttpClient(); 
var response = await client.PostAsync(uri, stringContent); 
+2

'HttpStringContent', her zaman bulunmayabilecek bir Windows çalışma zamanı sınıfı olduğunu unutmayın. Gereksinimler bölümüne bakın [burada] (https://msdn.microsoft.com/en-us/library/windows/apps/windows.web.http.httpstringcontent.aspx). – CodingGorilla

+0

Evet, bunun nedeni taşınabilir sınıf kütüphanesi. – IlDrugo

4

basit bir çözüm NuGet den Microsoft ASP.NET Web API 2.2 Client kullanmaktır.

Sonra sadece bunu yapabilirsiniz ve JSON nesne seri ve belirleriz Content-Type başlık application/json; charset=utf-8 için: Sorunuzu anlamak

, form kodlanmış içeriğin yerine JSON içeriğini göndermek istediğiniz
var data = new 
{ 
    name = "Foo", 
    category = "article" 
}; 

var client = new HttpClient(); 
client.BaseAddress = new Uri(baseUri); 
client.DefaultRequestHeaders.Add("token", token); 
var response = await client.PostAsJsonAsync("", data);