JSON verilerini HTTP isteğinden geri alma


92

Düzgün çalışan bir web isteğim var, ancak yalnızca Tamam durumunu döndürüyor, ancak geri dönmesini istediğim nesneye ihtiyacım var. İstediğim json değerini nasıl alacağımdan emin değilim. HttpClient nesnesini kullanmakta yeniyim, kaçırdığım bir özellik var mı? Geri dönen nesneye gerçekten ihtiyacım var. Herhangi bir yardım için teşekkürler

Çağrı yapmak - iyi çalışırsa, OK durumuna döner.

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept
  .Add(new MediaTypeWithQualityHeaderValue("application/json"));
var responseMsg = client.GetAsync(string.Format("http://localhost:5057/api/Photo")).Result;

API get yöntemi

//Cut out alot of code but you get the idea
public string Get()
{
    return JsonConvert.SerializeObject(returnedPhoto);
}

.NET 4.5 HttpClient sınıfını kullanırken yanıt içeriğini nasıl elde edeceğinizi mi soruyorsunuz?
Panagiotis Kanavos

Yanıtlar:


163

NET 4.5'te System.Net.HttpClient'e başvuruyorsanız, HttpResponseMessage.Content özelliğini kullanarak GetAsync tarafından döndürülen içeriği bir HttpContent- türetilmiş nesne olarak alabilirsiniz. Daha sonra içeriği HttpContent.ReadAsStringAsync yöntemini kullanarak veya ReadAsStreamAsync yöntemini kullanarak bir akış olarak bir dizeye okuyabilirsiniz .

HttpClient sınıfı belgeler bu örneği aşağıdakileri içermektedir:

  HttpClient client = new HttpClient();
  HttpResponseMessage response = await client.GetAsync("http://www.contoso.com/");
  response.EnsureSuccessStatusCode();
  string responseBody = await response.Content.ReadAsStringAsync();

3
Bunu test etmedim, ancak EnsureSuccessStatusCode dokümantasyonu "İçerik boş değilse, bu yöntem aynı zamanda Dispose'u ücretsiz yönetilen ve yönetilmeyen kaynakları çağırır" diyor. bu yüzden önce içeriği okumak isteyebilirsiniz. msdn.microsoft.com/en-us/library/…
Ryan Williams

4
Bunun için bir neden yok. Reflector tarafından kanıtlandığı gibi, EnsureSuccessStatusCode YALNIZCA durum kodu başarısız olursa, bir istisna atmadan hemen önce imha edecektir. Dokümantasyon metninin biraz kafa karıştırıcı olduğu başka bir durum.
Panagiotis Kanavos

1
Neden sadece değil client.GetStringAsync(...)? 2012'de ortalıkta yok muydu. Cevap 200doğru olmazsa ikisi de bir istisna yapar mıydı?
Simon_Weaver

1
@Simon_Weaver soru bu değildi çünkü OP, yanıttaki dizeyi nasıl okuyacağını sordu. Orada olan farklılıklar. Yanıtı inceleyemezsiniz, GetStringAsyncbu da yanıt mesajının ne olduğunu bilmediğiniz anlamına gelir. Muhtemelen yok bir 3xx yanıt döndürülürse atmak istiyorum. Bir azaltma hatası döndürülürse muhtemelen atmadan yeniden denemek istersiniz .
Panagiotis Kanavos

1
@Simon_Weaver bu aramayı yapmanın birçok yolu var - neden olmasın GetAsync<T>? Veya GetStreamAsync ve geçici dizeden kaçınarak akışı Json.NET'e geçirin mi? Yine, GetAsyncönce kullanıp sonra içerik nesnesine erişmek tercih edilebilir
Panagiotis Kanavos

40

Bina @Panagiotis Kanavos 'cevabı burada da yerine dize bir nesne olarak tepkisini dönecektir örnek olarak bir çalışma yöntemi var:

using System.Text;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json; // Nuget Package

public static async Task<object> PostCallAPI(string url, object jsonObject)
{
    try
    {
        using (HttpClient client = new HttpClient())
        {
            var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
            var response = await client.PostAsync(url, content);
            if (response != null)
            {
                var jsonString = await response.Content.ReadAsStringAsync();
                return JsonConvert.DeserializeObject<object>(jsonString);
            }
        }
    }
    catch (Exception ex)
    {
        myCustomLogger.LogException(ex);
    }
    return null;
}

Bunun yalnızca bir örnek olduğunu ve HttpClientonu bir using-cümlesinde kullanmak yerine muhtemelen paylaşılan bir örnek olarak kullanmak isteyeceğinizi unutmayın .


Dikkatli olun httpclient, kullanım
ifadesiyle

Bekleme anında geri döndüğünden, if (response != null)çağrı sonrası tamamlanmadan önce yürütülmesi mümkün mü?
Nishant


7

Bence en kısa yol:

var client = new HttpClient();
string reqUrl = $"http://myhost.mydomain.com/api/products/{ProdId}";
var prodResp = await client.GetAsync(reqUrl);
if (!prodResp.IsSuccessStatusCode){
    FailRequirement();
}
var prods = await prodResp.Content.ReadAsAsync<Products>();

7
Sadece id, ReadAsAsync'in bir uzantı yöntemi olduğunu ekledi. .net 4+ için System.Net.Http.Formatting ve .net core için Microsoft.AspNet.WebApi.Client kullanmanız gerekecektir. bunu çalıştırmak için.
Squibly

0

Normalde yaptığım şey, birine cevap vermeye benzer:

var response = await httpClient.GetAsync(completeURL); // http://192.168.0.1:915/api/Controller/Object

if (response.IsSuccessStatusCode == true)
    {
        string res = await response.Content.ReadAsStringAsync();
        var content = Json.Deserialize<Model>(res);

// do whatever you need with the JSON which is in 'content'
// ex: int id = content.Id;

        Navigate();
        return true;
    }
    else
    {
        await JSRuntime.Current.InvokeAsync<string>("alert", "Warning, the credentials you have entered are incorrect.");
        return false;
    }

'Model', C # model sınıfınızdır.


0

Şu şekilde benim için iyi çalışıyor -

public async Task<object> TestMethod(TestModel model)
    {
        try
        {
            var apicallObject = new
            {
                Id= model.Id,
                name= model.Name
            };

            if (apicallObject != null)
            {
                var bodyContent = JsonConvert.SerializeObject(apicallObject);
                using (HttpClient client = new HttpClient())
                {
                    var content = new StringContent(bodyContent.ToString(), Encoding.UTF8, "application/json");
                    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                    client.DefaultRequestHeaders.Add("access-token", _token); // _token = access token
                    var response = await client.PostAsync(_url, content); // _url =api endpoint url
                    if (response != null)
                    {
                        var jsonString = await response.Content.ReadAsStringAsync();

                        try
                        {
                            var result = JsonConvert.DeserializeObject<TestModel2>(jsonString); // TestModel2 = deserialize object
                        }
                        catch (Exception e){
                            //msg
                            throw e;
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return null;
    }
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.