web-dev-qa-db-fra.com

Meilleur moyen d'appeler un service Web JSON à partir d'une console .NET

J'héberge un service Web dans ASP.Net MVC3 qui renvoie une chaîne Json. Quel est le meilleur moyen d'appeler le service Web à partir d'une application console c # et d'analyser le retour dans un objet .NET?

Devrais-je référencer MVC3 dans mon application console?

Json.Net a quelques méthodes intéressantes pour la sérialisation et la désérialisation des objets .NET, mais je ne vois pas de moyens pour POSTing et GETing de valeurs depuis un service Web.

Ou devrais-je simplement créer ma propre méthode d'assistance pour le postage et l'accès au service Web? Comment pourrais-je sérialiser mon objet .net en paires de valeurs de clé?

88
BrokeMyLegBiking

J'utilise HttpWebRequest pour obtenir du service Web, ce qui me renvoie une chaîne JSON. Cela ressemble à quelque chose comme ça 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. Vous pouvez également générer la classe C # de manière statique à partir d'un exemple de sortie JSON à l'aide de cet outil codeplex: http://jsonclassgenerator.codeplex.com/

POST ressemble à ceci:

// 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 lors des tests automatisés de notre service Web.

135
GarethOwen

WebClient pour extraire le contenu de l'URL distante et JavaScriptSerializer ou Json.NET pour désérialiser le JSON en un objet .NET. Par exemple, vous définissez une classe de modèle qui reflétera la structure JSON, puis:

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 quelques REST structures clientes que vous pouvez extraire, telles que RestSharp .

49
Darin Dimitrov

Bien que les réponses existantes soient des approches valables, elles sont désuètes. 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 HTTP GET asynchrone.

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