93 votes

Meilleure façon d'appeler un WebService JSON à partir d'une console .NET

J'héberge un service web en ASP.Net MVC3 qui renvoie une chaîne Json. Quelle est la meilleure façon d'appeler le service Web à partir d'une application console C# et d'analyser le retour dans un objet .NET ?

Dois-je faire référence à MVC3 dans mon application console ?

Json.Net possède de bonnes méthodes pour sérialiser et désérialiser les objets .NET, mais je ne vois pas de moyens pour POSTing et GETing des valeurs d'un webservice.

Ou dois-je simplement créer ma propre méthode d'aide pour le POST et le GET au service web ? Comment puis-je sérialiser mon objet .net en paires clé-valeur ?

146voto

GarethOwen Points 2406

J'utilise HttpWebRequest pour obtenir le service Web, qui me renvoie une chaîne JSON. Cela ressemble à quelque chose comme ceci pour un GET :

// Returns JSON string
string GET(string url) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    try {
        WebResponse response = request.GetResponse();
        using (Stream responseStream = response.GetResponseStream()) {
            StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
            return reader.ReadToEnd();
        }
    }
    catch (WebException ex) {
        WebResponse errorResponse = ex.Response;
        using (Stream responseStream = errorResponse.GetResponseStream())
        {
            StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding("utf-8"));
            String errorText = reader.ReadToEnd();
            // log errorText
        }
        throw;
    }
}

J'utilise ensuite JSON.Net pour analyser dynamiquement la chaîne de caractères. Vous pouvez également générer la classe C# de manière statique à partir d'un exemple de sortie JSON en utilisant cet outil de codeplex : http://jsonclassgenerator.codeplex.com/

Le POST ressemble à ça :

// POST a JSON string
void POST(string url, string jsonContent) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";

    System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
    Byte[] byteArray = encoding.GetBytes(jsonContent);

    request.ContentLength = byteArray.Length;
    request.ContentType = @"application/json";

    using (Stream dataStream = request.GetRequestStream()) {
        dataStream.Write(byteArray, 0, byteArray.Length);
    }
    long length = 0;
    try {
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
            length = response.ContentLength;
        }
    }
    catch (WebException ex) {
        // Log exception and throw as for GET example above
    }
}

J'utilise un code comme celui-ci dans les tests automatisés de notre service web.

0 votes

JsonClassGenerator est génial. La désérialisation est facile car il suffit de construire l'objet fortement typé en passant la chaîne json.

0 votes

Si vous avez des caractères dans le jeu non-ascii, le code que vous avez doit être modifié un peu. ContentLength représente le nombre d'octets dans le contenu affiché, donc techniquement request.ContentLength devrait être défini sur byteArray.Length, et non sur jsonContent.Length.

0 votes

Encoding.GetEncoding("utf-8") peut être remplacé par Encoding.UTF8

50voto

Darin Dimitrov Points 528142

WebClient pour récupérer le contenu de l'url distante et JavaScriptSerializer o Json.NET pour désérialiser le JSON en un objet .NET. Par exemple, vous définissez une classe modèle qui reflétera la structure JSON et ensuite :

using (var client = new WebClient())
{
    var json = client.DownloadString("http://example.com/json");
    var serializer = new JavaScriptSerializer();
    SomeModel model = serializer.Deserialize<SomeModel>(json);
    // TODO: do something with the model
}

Il existe également des frameworks clients REST que vous pouvez vérifier, tels que RestSharp .

0 votes

@BrokeMyLegBiking, lequel ? Cela n'a rien à voir avec ASPAjax. Si vous parlez de la classe JavaScriptSerializer, elle est intégrée à .NET dans l'assemblage System.Web.Extensions, vous n'avez donc pas besoin de télécharger ou d'installer quoi que ce soit.

0 votes

Existe-t-il un moyen de transformer tous les noms de propriété/valeurs de propriété d'un objet c# en paires clé-valeur POST (ou en paires clé-valeur GET) ? afin que je puisse effectivement utiliser l'objet c# comme valeur d'entrée pour ma méthode de webservice ?

0 votes

@BrokeMyLegBiking, cela dépendra de l'objet que vous avez et de la manière dont le service web attend l'entrée.

9voto

nomad311 Points 303

Bien que les réponses existantes soient des approches valables, elles sont dépassées. HttpClient est une interface moderne permettant de travailler avec des services web RESTful. Vérifiez la section des exemples de la page dans le lien , il a un cas d'utilisation très simple pour un GET HTTP asynchrone .

using (var client = new System.Net.Http.HttpClient())
{
    return await client.GetStringAsync("https://reqres.in/api/users/3"); //uri
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X