Kaip skambinti „REST API“ naudojant „C #“?

Tai kodas, kurį vis dar turiu:

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

Problema yra ta, kad manau, kad išimties blokas prasideda (nes kai ištrinu bandomąjį gaudymą, gaunu serverio klaidą (500). Tačiau nematau konsolės. Iš eilių, kurias įterpiu į sugavimo bloką.

Mano konsolė:

 The thread 'vshost.NotifyLoad' (0x1a20) has exited with code 0 (0x0). The thread '<No Name>' (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 '<No Name>' (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). 

Aš naudoju „Visual Studio 2011“ beta ir „.NET 4,5“ beta versijas.

253
08 марта '12 в 18:35 2012-03-08 18:35 NullVoxPopuli yra nustatytas kovo 8 d . 12 val. 18:35 2012-03-08 18:35
@ 13 atsakymų

ASP.Net Web API pakeitė anksčiau minėtą WCF WCF sąsają.

Maniau, kad paskelbsiu atnaujintą atsakymą, nes dauguma šių atsakymų yra nuo 2012 m. Pradžios, ir šis srautas yra vienas geriausių rezultatų, kai „Google“ ieško „skambinti ramiai aptarnaujančia paslauga C #“.

Dabartinis „Microsoft“ vadovas yra naudoti „Microsoft ASP.NET Web API“ klientų bibliotekas, kad galėtumėte naudotis „RESTful“ paslauga. Jis yra „NuGet“ paketas, „Microsoft.AspNet.WebApi.Client“. Jums reikia pridėti šį „NuGet“ paketą prie savo sprendimo.

Štai kaip jūsų pavyzdys atrodo įgyvendinant ASP.Net Web API kliento biblioteką:

 using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; namespace ConsoleProgram { public class DataObject { public string Name { get; set; } } public class Class1 { private const string URL = "https://sub.domain.com/objects.json"; private string urlParameters = "?api_key=123"; static void Main(string[] 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<IEnumerable<DataObject>>().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(); } } } 

Jei planuojate atlikti kelis prašymus, turite pakartotinai naudoti „HttpClient“ egzempliorių. Žr. Šį klausimą ir jo atsakymus, kad sužinotumėte, kodėl šiuo atveju HttpClient egzemplioriuje nenaudojamas naudojimo pareiškimas . Ar HttpClient ir HttpClientHandler turi būti pašalinti?

Daugiau informacijos, įskaitant ir kitus pavyzdžius, galite rasti čia: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

Šis dienoraščio įrašas taip pat gali būti naudingas: http://johnnycode.com/2012/02/23/consuming-your-own-asp-net-web-api-rest-service/

347
04 июля '13 в 1:20 2013-07-04 01:20 atsakymą pateikė Brian Swift liepos 4 d., 13 val

Mano pasiūlymas būtų naudoti „ RestSharp“ . Galite skambinti į „REST“ paslaugas ir perkelti juos į POCO objektus, turinčius labai mažą kodo modelį, kad iš tikrųjų analizuotumėte atsakymą. Tai neišspręs jūsų konkrečios klaidos, bet atsakys į jūsų bendrą klausimą, kaip skambinti „REST“ paslaugomis. Kad pakeistumėte kodą, kad jį būtų galima naudoti, jis turi būti lengvai atsiperkamas ir patikimas. Tai tik mano 2 centai

border=0
107
08 марта '12 в 18:40 2012-03-08 18:40 atsakymą pateikė Justin Pihony kovo 8 d. 12 val. 18:40 2012-03-08 18:40

Aš nesu rimtas, aš tikiu, bet apvyniokite savo IDisposable daiktus using blokus, kad būtų užtikrintas tinkamas šalinimas

 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); } } } } 
26
08 марта '12 в 18:45 2012-03-08 18:45 atsakymą pateikė Jesse C. Slicer kovo 12 d. 12 val. 18:45 2012-03-08 18:45

Prašymui naudokite žemiau esantį kodą RIP api

 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 string URL = "https://XXXX/rest/api/2/component"; private const string DATA = @"{ ""name"": ""Component 2"", ""description"": ""This is a JIRA component"", ""leadUserName"": ""xx"", ""assigneeType"": ""PROJECT_LEAD"", ""isAssigneeTypeValid"": false, ""project"": ""TP""}"; static void Main(string[] 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.ToBase64String(cred)); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); System.Net.Http.HttpContent content = new StringContent(DATA, UTF8Encoding.UTF8, "application/json"); HttpResponseMessage messge = client.PostAsync(URL, content).Result; string description = string.Empty; if (messge.IsSuccessStatusCode) { string result = messge.Content.ReadAsStringAsync().Result; description = result; } } } } 
14
20 марта '14 в 13:32 2014-03-20 13:32 atsakymą pateikė Srinivasan Radhakrishnan kovo 14 d. 13:32 2014-03-20 13:32

REST API skambučio naujinimas naudojant .NET 4.5 arba .NET Core

Aš siūlau DalSoft.RestClient (įspėjimas, kurį sukūriau). Priežastis yra ta, kad ji naudoja dinaminį įvedimą, galite viską apvynioti vienu nemokamu skambučiu, įskaitant serializavimą / de-serializavimą. Toliau pateikiamas darbo pavyzdys:

 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); 
9
23 марта '15 в 17:55 2015-03-23 17:55 DalSoft atsakymą pateikė kovo 23 d. 15 val. 17:55 2015-03-23 ​​17:55

Check out Atnaujinkite, jei norite skambinti, kad galėtumėte aptarnauti .net. Man buvo labai paprasta naudoti: https://github.com/paulcbetts/refit

Įdiekite: Automatinė saugi REST biblioteka .NET Core, Xamarin ir .NET

„Refit“ yra biblioteka, kurią įkvėpė „Square Retrofit“ biblioteka, ir ji paverčia jūsų REST API į gyvą sąsają:

 public interface IGitHubApi { [Get("/users/{user}")] Task<User> GetUser(string user); } The RestService class generates an implementation of IGitHubApi that uses HttpClient to make its calls: var gitHubApi = RestService.For<IGitHubApi>("https://api.github.com"); var octocat = await gitHubApi.GetUser("octocat"); 
4
19 окт. Patrickbadley atsakymas, pateiktas spalio 19 d 2016-10-19 20:48 '16 at 8:48 pm 2016-10-19 20:48

Gaukite

 // GET JSON Response public WeatherResponseModel GET(string 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")); String errorText = reader.ReadToEnd(); // log errorText } throw; } return model; } 

POST:

 // 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()) { // 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")); String errorText = reader.ReadToEnd(); // log errorText } throw; } } 

Pastaba Serializacijai ir „desirialze JSON“ naudoju „Newtonsoft.Json NuGet“ paketą.

3
06 сент. JerryGoyal atsakymas 2017-09-06 21:46 '17 - 21:46 2017-09-06 21:46
  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 string xmlroot=@"<root><childnodes>passing parameters</childnodes></root>"; string xmlroot2=@"<root><childnodes>passing parameters</childnodes></root>"; //---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()); string response = stredr.ReadToEnd(); 
1
25 сент. Atsakymas pateikiamas rajendra lenka 25 sep . 2013-09-25 06:46 '13, 6:46, 2013-09-25 06:46

Tai yra pavyzdinis kodas, kuris veikia tiksliai. Tai užtruko per dieną, kad galėčiau tai perskaityti iš „Rest“ paslaugos objektų rinkinio:

„RootObject“ yra Im objekto tipas, kuris skaitomas iš kitos paslaugos.

 string url = @"http://restcountries.eu/rest/v1"; DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(IEnumerable<RootObject>)); WebClient syncClient = new WebClient(); string content = syncClient.DownloadString(url); using (MemoryStream memo = new MemoryStream(Encoding.Unicode.GetBytes(content))) { IEnumerable<RootObject> countries = (IEnumerable<RootObject>)serializer.ReadObject(memo); } Console.Read(); 
1
21 сент. atsakymą pateikė vartotojo4064093 21 sep . 2014-09-21 21:06 '14, 21:06 2014-09-21 21:06

Kadangi naudojate „Visual Studio 11“ beta versiją, jūs norite naudoti naujausias ir didžiausias. Naujame „Web Api“ yra klasių.

Žr. „HttpClient“: http://wcf.codeplex.com/wikipage?title=WCF%20HTTP

0
08 марта '12 в 18:45 2012-03-08 18:45 atsakymas pateikiamas kauliukų kovo 8 d. 12 val. 18:45 2012-03-08 18:45

Aš tai padariau taip pat su „Web Api 2.0“. Galite pašalinti „UseDefaultCredentials.“. Aš naudoju tai naudoti savo reikmėms.

  List<YourObject> listObjects = new List<YourObject>(); string response = ""; using (var client = new WebClient() { UseDefaultCredentials = true }) { response = client.DownloadString(apiUrl); } listObjects = JsonConvert.DeserializeObject<List<YourObject>>(response); return listObjects ; 
0
23 окт. Atsakymą MNF pateikia spalio 23 d. 2018-10-23 16:45 '18, 4:45 pm 2018-10-23 16:45

Galite pabandyti naudoti paprastesnę „ WebClient klasę:

http://www.dotnetperls.com/webclient

0
08 марта '12 в 20:48 2012-03-08 20:48 atsakymas į Dmitriją S. kovo 12 d. 12 val. 20:48 2012-03-08 20:48

Pirmasis žingsnis yra sukurti „http“ kliento pagalbininko klasę.

 using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; namespace callApi.Helpers { public class CallApi { private readonly Uri BaseUrlUri; private HttpClient client = new HttpClient(); public CallApi(string baseUrl) { BaseUrlUri = new Uri(baseUrl); client.BaseAddress = BaseUrlUri; client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); } public HttpClient getClient() { return client; } public HttpClient getClientWithBearer(string token) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); return client; } } } 

Tada galite naudoti šią klasę savo kode.

Tai yra pavyzdys, kaip skambinate likusiems api be žiniasklaidos, naudodami aukščiau pateiktą klasę.

 // GET api/values [HttpGet] public async Task<ActionResult<string>> postNoBearerAsync(string email, string password,string baseUrl, string action) { var request = new LoginRequest { email = email, password = password }; var callApi = new CallApi(baseUrl); var client = callApi.getClient(); HttpResponseMessage response = await client.PostAsJsonAsync(action, request); if (response.IsSuccessStatusCode) return Ok(await response.Content.ReadAsAsync<string>()); else return NotFound(); } 

Tai yra pavyzdys, kaip galite skambinti kitiems api, kuriems reikalinga žiniasklaida.

 // GET api/values [HttpGet] public async Task<ActionResult<string>> getUseBearerAsync(string token, string baseUrl, string action) { var callApi = new CallApi(baseUrl); var client = callApi.getClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); HttpResponseMessage response = await client.GetAsync(action); if (response.IsSuccessStatusCode) { return Ok(await response.Content.ReadAsStringAsync()); } else return NotFound(); } 

Taip pat galite kreiptis į pagrindinį repo, jei norite matyti darbo pavyzdį, kaip jis veikia.

https://github.com/mokh223/callApi

-2
05 окт. atsakymas duotas mokh223 05 okt. 2018-10-05 10:57 '18, 10:57

Kiti klausimai apie žymes arba Užduoti klausimą