Hoe maak ik aanroepen naar een REST api met C#?

Dit is de code die ik tot nu toe heb:

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

        }
    }
}

Het probleem is dat ik denk dat het uitzonderingsblok getriggerd wordt (want als ik de try-catch verwijder, krijg ik een server error (500) melding. Maar ik zie niet de Console.Out regels die ik in het catch-blok heb gezet.

Mijn Console:

De thread 'vshost.NotifyLoad' (0x1a20) is beeindigd met code 0 (0x0).
De thread '<No Name>' (0x1988) is beeindigd met code 0 (0x0).
De thread 'vshost.LoadReference' (0x1710) is beëindigd met code 0 (0x0).
'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Geladen 'c:\users\l. preston sego iii\documents\visual studio 11\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe', Symbolen geladen.
'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Geladen 'C:WindowsMicrosoft.NetAssembly\GAC_MSILSystem.Configuration.dll', Het laden van symbolen overgeslagen. Module is geoptimaliseerd en de debugger optie 'Just My Code' is ingeschakeld.
Een eerste toevallige uitzondering van het type 'System.Net.WebException' kwam voor in System.dll
De thread 'vshost.RunParkingWindow' (0x184c) is beeindigd met code 0 (0x0).
De thread '<No Name>' (0x1810) is beëindigd met code 0 (0x0).
Het programma '[2780] ConsoleApplication1.vshost.exe: Program Trace' is beëindigd met code 0 (0x0).
Het programma '[2780] ConsoleApplication1.vshost.exe: Managed (v4.0.30319)' is beeindigd met code 0 (0x0).

Ik'm gebruik Visual Studio 2011 Beta, en .NET 4.5 Beta.

Mijn suggestie zou zijn om RestSharp te gebruiken. U kunt oproepen doen naar REST services en ze in POCO objecten laten gieten met heel weinig boilerplate code om daadwerkelijk het antwoord te moeten ontleden. Dit zal uw specifieke fout niet oplossen, maar beantwoordt uw algemene vraag over hoe aanroepen naar REST diensten te maken. Het feit dat je je code moet veranderen om het te gebruiken zou zich moeten uitbetalen in gebruiksgemak en robuustheid in de toekomst. Dat is slechts mijn 2 cent

Commentaren (10)

Het zal er wel niets mee te maken hebben, maar wikkel je IDisposable objecten in using blokken om een goede verwijdering te verzekeren:

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

        }
    }
}
Commentaren (3)

Aangezien u Visual Studio 11 Beta gebruikt, wilt u de nieuwste en beste gebruiken. De nieuwe Web Api bevat klassen hiervoor.

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

Commentaren (0)