web-dev-qa-db-fra.com

Réception de données JSON à partir d'une requête HTTP

J'ai une demande Web qui fonctionne correctement, mais elle ne fait que renvoyer l'état OK, mais j'ai besoin de l'objet que je demande. Je ne suis pas sûr de savoir comment obtenir la valeur JSON que je demande. Je suis novice dans l'utilisation de l'objet HttpClient. Existe-t-il une propriété qui me manque? J'ai vraiment besoin de l'objet qui revient. Merci pour toute aide

Effectuer l'appel - fonctionne correctement renvoie l'état OK.

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

La méthode api get

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

Si vous faites référence à System.Net.HttpClient dans .NET 4.5, vous pouvez obtenir le contenu renvoyé par GetAsync à l'aide de la propriété HttpResponseMessage.Content sous la forme d'un objet HttpContent - dérivé . Vous pouvez ensuite lire le contenu d'une chaîne à l'aide de la méthode HttpContent.ReadAsStringAsync ou en tant que flux à l'aide de la méthode ReadAsStreamAsync .

La documentation de la classe HttpClient inclut cet exemple:

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

En vous appuyant sur @ Panagiotis Kanavos 'answer, voici une méthode de travail à titre d'exemple qui renverra également la réponse sous forme d'objet au lieu de chaîne:

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;
}

N'oubliez pas qu'il s'agit d'un exemple et que vous voudriez probablement utiliser HttpClient comme instance partagée au lieu de l'utiliser dans une clause using.

13
Wouter Vanherck

Je pense que le plus court chemin est:

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>();
0
Greg Z.

Ce que je fais normalement, semblable à répondre à un:

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;
    }

Où 'modèle' est votre classe de modèle C #.

0
James Heffer