Comment puis-je faire des appels à une api REST en utilisant c #?

C’est 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 ssortingng URL = "https://sub.domain.com/objects.json?api_key=123"; private const ssortingng DATA = @"{""object"":{""name"":""Name""}}"; static void Main(ssortingng[] 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); ssortingng 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é (parce que lorsque je supprime le try-catch, je reçois un message d’erreur du serveur (500). Mais je ne vois pas les lignes de Console.Out dans le bloc catch.

Ma console:

 The thread 'vshost.NotifyLoad' (0x1a20) has exited with code 0 (0x0). The thread '' (0x1988) has exited with code 0 (0x0). The thread 'vshost.LoadReference' (0x1710) has exited with code 0 (0x0). 'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Loaded 'c:\users\l. preston sego iii\documents\visual studio 11\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe', Symbols loaded. 'ConsoleApplication1.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. A first chance exception of type 'System.Net.WebException' occurred in System.dll The thread 'vshost.RunParkingWindow' (0x184c) has exited with code 0 (0x0). The thread '' (0x1810) has exited with code 0 (0x0). The program '[2780] ConsoleApplication1.vshost.exe: Program Trace' has exited with code 0 (0x0). The program '[2780] ConsoleApplication1.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0). 

J’utilise Visual Studio 2011 Beta et .NET 4.5 Beta.

L’API Web ASP.Net a remplacé l’API Web WCF mentionnée précédemment.

Je pensais que je publierais une réponse mise à jour car la plupart de ces réponses datent du début de 2012, et ce fil est l’un des meilleurs résultats lorsque vous effectuez une recherche sur Google pour “appeler le service c #”.

Les directives actuelles de Microsoft consistent à utiliser les bibliothèques clientes Microsoft ASP.NET Web API pour utiliser un service RESTful. Ceci est disponible sous forme de package NuGet, Microsoft.AspNet.WebApi.Client. Vous devrez append ce package NuGet à votre solution.

Voici à quoi ressemblerait votre exemple une fois implémenté à l’aide de la bibliothèque client de l’API Web ASP.Net:

 using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; namespace ConsoleProgram { public class DataObject { public ssortingng Name { get; set; } } public class Class1 { private const ssortingng URL = "https://sub.domain.com/objects.json"; private ssortingng urlParameters = "?api_key=123"; static void Main(ssortingng[] args) { HttpClient client = new HttpClient(); client.BaseAddress = new Uri(URL); // Add an Accept header for JSON format. client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); // List data response. HttpResponseMessage response = client.GetAsync(urlParameters).Result; // Blocking call! Program will wait here until a response is received or a timeout occurs. if (response.IsSuccessStatusCode) { // Parse the response body. var dataObjects = response.Content.ReadAsAsync>().Result; //Make sure to add a reference to System.Net.Http.Formatting.dll foreach (var d in dataObjects) { Console.WriteLine("{0}", d.Name); } } else { Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase); } //Make any other calls using HttpClient here. //Dispose once all HttpClient calls are complete. This is not necessary if the containing object will be disposed of; for example in this case the HttpClient instance will be disposed automatically when the application terminates so the following call is superfluous. client.Dispose(); } } } 

Si vous envisagez de faire plusieurs demandes, vous devez réutiliser votre instance HttpClient. Voir cette question et ses réponses pour plus de détails sur la raison pour laquelle une instruction using n’a pas été utilisée sur l’instance HttpClient dans ce cas: HttpClient et HttpClientHandler doivent-ils être éliminés?

Pour plus de détails, y compris d’autres exemples, cliquez ici: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

Cet article peut aussi être utile: http://johnnycode.com/2012/02/23/consuming-your-own-asp-net-web-api-rest-service/

Ma suggestion serait d’utiliser RestSharp . Vous pouvez passer des appels aux services REST et les convertir en objects POCO avec très peu de code passe-partout pour devoir parsingr la réponse. Cela ne résoudra pas votre erreur particulière, mais répond à votre question générale sur la manière de passer des appels aux services REST. Devoir changer votre code pour l’utiliser devrait être rentable grâce à la facilité d’utilisation et à la robustesse. C’est juste mes 2 cents si

Je ne suis pas lié, mais encapsulez vos objects IDisposable en using blocs pour assurer 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 ssortingng URL = "https://sub.domain.com/objects.json?api_key=123"; private const ssortingng DATA = @"{""object"":{""name"":""Name""}}"; static void Main(ssortingng[] 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()) { if (webStream != null) { using (StreamReader responseReader = new StreamReader(webStream)) { ssortingng response = responseReader.ReadToEnd(); Console.Out.WriteLine(response); } } } } catch (Exception e) { Console.Out.WriteLine("-----------------"); Console.Out.WriteLine(e.Message); } } } } 

Veuillez utiliser le code ci-dessous pour votre demande d’API REST

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Json; namespace ConsoleApplication2 { class Program { private const ssortingng URL = "https://XXXX/rest/api/2/component"; private const ssortingng DATA = @"{ ""name"": ""Component 2"", ""description"": ""This is a JIRA component"", ""leadUserName"": ""xx"", ""assigneeType"": ""PROJECT_LEAD"", ""isAssigneeTypeValid"": false, ""project"": ""TP""}"; static void Main(ssortingng[] args) { AddComponent(); } private static void AddComponent() { System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(); client.BaseAddress = new System.Uri(URL); byte[] cred = UTF8Encoding.UTF8.GetBytes("username:password"); client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64Ssortingng(cred)); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); System.Net.Http.HttpContent content = new SsortingngContent(DATA, UTF8Encoding.UTF8, "application/json"); HttpResponseMessage messge = client.PostAsync(URL, content).Result; ssortingng description = ssortingng.Empty; if (messge.IsSuccessStatusCode) { ssortingng result = messge.Content.ReadAsSsortingngAsync().Result; description = result; } } } } 

Mise à jour pour appeler une API REST lors de l’utilisation de .NET 4.5.

Je suggérerais DalSoft.RestClient (mise en garde je l’ai créé). La raison en est qu’elle utilise le typage dynamic, vous pouvez tout regrouper dans un seul appel, y compris la sérialisation / désérialisation. Voici un exemple de travail PUT:

 dynamic client = new RestClient("http://jsonplaceholder.typicode.com"); var post = new Post { title = "foo", body = "bar", userId = 10 }; var result = await client.Posts(1).Put(post); 

Découvrez Refit pour faire des appels aux services de repos depuis .net. Je l’ai trouvé très facile à utiliser: https://github.com/paulcbetts/refit

Refit: La bibliothèque REST automatique de type sécurisé pour .NET Core, Xamarin et .NET

Refit est une bibliothèque fortement inspirée de la bibliothèque Retrofit de Square et transforme votre API REST en une interface en direct:

 public interface IGitHubApi { [Get("/users/{user}")] Task GetUser(ssortingng user); } The RestService class generates an implementation of IGitHubApi that uses HttpClient to make its calls: var gitHubApi = RestService.For("https://api.github.com"); var octocat = await gitHubApi.GetUser("octocat"); 
  var TakingRequset = WebRequest.Create("http://xxx.acv.com/MethodName/Get"); TakingRequset.Method = "POST"; TakingRequset.ContentType = "text/xml;charset=utf-8"; TakingRequset.PreAuthenticate = true; //---Serving Request path query var PAQ = TakingRequset.RequestUri.PathAndQuery; //---creating your xml as per the host reqirement ssortingng xmlroot=@"passing parameters"; ssortingng xmlroot2=@"passing parameters"; //---Adding Headers as requested by host xmlroot2 = (xmlroot2 + "XXX---"); //---Adding Headers Value as requested by host // var RequestheaderVales = Method(xmlroot2); WebProxy proxy = new WebProxy("XXXXX-----llll", 8080); proxy.Credentials = new NetworkCredential("XXX---uuuu", "XXX----", "XXXX----"); System.Net.WebRequest.DefaultWebProxy = proxy; // Adding The Request into Headers TakingRequset.Headers.Add("xxx", "Any Request Variable "); TakingRequset.Headers.Add("xxx", "Any Request Variable"); byte[] byteData = Encoding.UTF8.GetBytes(xmlroot); TakingRequset.ContentLength = byteData.Length; using (Stream postStream = TakingRequset.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); postStream.Close(); } StreamReader stredr = new StreamReader(TakingRequset.GetResponse().GetResponseStream()); ssortingng response = stredr.ReadToEnd(); 

Ceci est un exemple de code qui fonctionne à coup sûr. Il m’a fallu une journée pour faire ceci pour lire un ensemble d’object du service de repos:

RootObject est le type de l’object que je lis depuis le service de repos.

 ssortingng url = @"http://restcounsortinges.eu/rest/v1"; DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(IEnumerable)); WebClient syncClient = new WebClient(); ssortingng content = syncClient.DownloadSsortingng(url); using (MemoryStream memo = new MemoryStream(Encoding.Unicode.GetBytes(content))) { IEnumerable counsortinges = (IEnumerable)serializer.ReadObject(memo); } Console.Read(); 

Puisque vous utilisez Visual Studio 11 Beta, vous voudrez utiliser le dernier et le meilleur. Le nouveau Web Api contient des classes pour cela.

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

OBTENIR:

 // GET JSON Response public WeatherResponseModel GET(ssortingng url) { WeatherResponseModel model = new WeatherResponseModel(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); try { WebResponse response = request.GetResponse(); using(Stream responseStream = response.GetResponseStream()) { StreamReader reader = new StreamReader(responseStream, Encoding.UTF8); model = JsonConvert.DeserializeObject < WeatherResponseModel > (reader.ReadToEnd()); } } catch (WebException ex) { WebResponse errorResponse = ex.Response; using(Stream responseStream = errorResponse.GetResponseStream()) { StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); Ssortingng errorText = reader.ReadToEnd(); // log errorText } throw; } return model; } 

POSTER:

 // POST a JSON ssortingng void POST(ssortingng url, ssortingng 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()) { // got response length = response.ContentLength; } } catch (WebException ex) { WebResponse errorResponse = ex.Response; using(Stream responseStream = errorResponse.GetResponseStream()) { StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")); Ssortingng errorText = reader.ReadToEnd(); // log errorText } throw; } } 

Remarque: Pour sérialiser et désirialiser JSON, j’ai utilisé le package NuGet de Newtonsoft.Json.