Comment faire des appels à une api REST en utilisant C# ?

Voici le code que j'ai jusqu'à présent :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Net.Http;
using System.Web;
using System.Net;
using System.IO;

namespace ConsoleProgram
{
    public class Class1
    {
        private const string URL = "https://sub.domain.com/objects.json?api_key=123";
        private const string DATA = @"{""object"":{""name"":""Name""}}";

        static void Main(string[] args)
        {
            Class1.CreateObject();
        }

        private static void CreateObject()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
            request.Method = "POST";
            request.ContentType = "application/json"; 
            request.ContentLength = DATA.Length;
            StreamWriter requestWriter = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
            requestWriter.Write(DATA);
            requestWriter.Close();

             try {
                WebResponse webResponse = request.GetResponse();
                Stream webStream = webResponse.GetResponseStream();
                StreamReader responseReader = new StreamReader(webStream);
                string response = responseReader.ReadToEnd();
                Console.Out.WriteLine(response);
                responseReader.Close();
            } catch (Exception e) {
                Console.Out.WriteLine("-----------------");
                Console.Out.WriteLine(e.Message);
            }

        }
    }
}

Le problème est que je pense que le bloc d'exception est déclenché (car lorsque je supprime le try-catch, j'obtiens un message d'erreur serveur (500). Mais je ne vois pas les lignes Console.Out que j'ai mises dans le bloc catch.

Ma Console :

Aucune Le thread 'vshost.NotifyLoad&#39 ; (0x1a20) a quitté avec le code 0 (0x0). Le thread '&#39 ; (0x1988) a quitté avec le code 0 (0x0). Le thread 'vshost.LoadReference&#39 ; (0x1710) a quitté avec le code 0 (0x0). 'ConsoleApplication1.vshost.exe&#39 ; (Géré (v4.0.30319)) : Loaded 'c:\users\l. preston sego iii\documents\visual studio 11\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe&#39 ;, Symboles chargés. 'ConsoleApplication1.vshost.exe&#39 ; (Managed (v4.0.30319)) : Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll&#39 ;, Skipped loading symbols. Le module est optimisé et l'option 'Just My Code&#39 ; du débogueur est activée. Une exception de première chance de type 'System.Net.WebException&#39 ; s'est produite dans System.dll Le thread 'vshost.RunParkingWindow&#39 ; (0x184c) a quitté avec le code 0 (0x0). Le thread '&#39 ; (0x1810) a quitté avec le code 0 (0x0). Le programme &#39 ; [2780] ConsoleApplication1.vshost.exe : Program Trace&#39 ; a quitté avec le code 0 (0x0). Le programme &#39 ;[2780] ConsoleApplication1.vshost.exe : Managed (v4.0.30319)&#39 ; s'est arrêté avec le code 0 (0x0).



J'utilise Visual Studio 2011 Beta, et .NET 4.5 Beta.

Ma suggestion serait d'utiliser [RestSharp][1]. Vous pouvez faire des appels à des services REST et les convertir en objets POCO avec très peu de code passe-partout pour analyser la réponse. Cela ne résoudra pas votre erreur particulière, mais répond à votre question générale sur la façon de faire des appels aux services REST. Le fait de devoir modifier votre code pour l'utiliser devrait se traduire par une facilité d'utilisation et une robustesse accrues. Ce ne sont que mes deux centimes.

[1] : http://restsharp.org/

Commentaires (10)

Je suis sûr que cela n'a rien à voir, mais il faut envelopper vos objets IDisposable dans des blocs using pour garantir une élimination correcte :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;
using System.Web;
using System.Net;
using System.IO;

namespace ConsoleProgram
{
    public class Class1
    {
        private const string URL = "https://sub.domain.com/objects.json?api_key=123";
        private const string DATA = @"{""object"":{""name"":""Name""}}";

        static void Main(string[] args)
        {
            Class1.CreateObject();
        }

        private static void CreateObject()
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
            request.Method = "POST";
            request.ContentType = "application/json";
            request.ContentLength = DATA.Length;
            using (Stream webStream = request.GetRequestStream())
            using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
            {
                requestWriter.Write(DATA);
            }

            try
            {
                WebResponse webResponse = request.GetResponse();
                using (Stream webStream = webResponse.GetResponseStream() ?? Stream.Null)
                using (StreamReader responseReader = new StreamReader(webStream))
                {
                    string response = responseReader.ReadToEnd();
                    Console.Out.WriteLine(response);
                }
            }
            catch (Exception e)
            {
                Console.Out.WriteLine("-----------------");
                Console.Out.WriteLine(e.Message);
            }

        }
    }
}
Commentaires (3)

Comme vous utilisez Visual Studio 11 Beta, vous voudrez utiliser la dernière et la meilleure version. La nouvelle Web Api contient des classes pour cela.

Voir HttpClient : http://wcf.codeplex.com/wikipage?title=WCF%20HTTP

Commentaires (0)