Cum pot face apeluri de la un REST api, folosind C#?

Acesta este codul pe care îl avea până acum:

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 este că eu cred că excepția de bloc este declanșat (pentru că atunci când am elimina try-catch, primesc o eroare de server (500) mesaj. Dar eu nu't vedea Consola.Liniile le-am pus în bloc catch.

Consola Mea:

`nimic Firul 'vshost.NotifyLoad' (0x1a20) s-a terminat cu codul 0 (0x0). Firul '' (0x1988) s-a terminat cu codul 0 (0x0). Firul 'vshost.LoadReference' (0x1710) s-a terminat cu codul 0 (0x0). 'ConsoleApplication1.vshost.exe' (Gestionate (v4.0.30319)): Încărcat de 'c:\users\l. preston sego iii\documente\visual studio 11\Proiecte\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe', Simboluri încărcate. 'ConsoleApplication1.vshost.exe' (Gestionate (v4.0.30319)): Încărcat 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll'în grabă, de încărcare simboluri. Modulul este optimizat și debugger opțiune 'Doar Codul Meu' este activat. O primă șansă excepție de tip 'System.Net.WebException' au avut loc în System.dll Firul 'vshost.RunParkingWindow' (0x184c) s-a terminat cu codul 0 (0x0). Firul '' (0x1810) s-a terminat cu codul 0 (0x0). Programul '[2780] ConsoleApplication1.vshost.exe: Program Trace' a ieșit cu codul 0 (0x0). Programul '[2780] ConsoleApplication1.vshost.exe: Reusit (v4.0.30319)' a ieșit cu codul 0 (0x0). ``

Am'm folosind Visual Studio 2011 Beta, și .NET 4.5 Beta.

Comentarii la întrebare (5)
Soluția

La ASP.Net API Web a înlocuit WCF Web API menționate anterior.

Am crezut că am'd post actualizat răspuns deoarece cele mai multe dintre aceste răspunsuri sunt de la începutul anului 2012, iar acest thread este unul dintre primele rezultate atunci când faci o căutare pe Google pentru "apel odihnitor serviciu c#".

Orientări actuale de la Microsoft este de a utiliza Microsoft ASP.NET Web API Client Biblioteci pentru a consuma o zi de serviciu. Acesta este disponibil ca un pachet de NuGet, Microsoft.AspNet.WebApi.Client. Veți avea nevoie pentru a adăuga acest pachet NuGet la o soluție.

Aici's cum de exemplu s-ar uita atunci când sunt implementate folosind ASP.Net Web API Client Library:

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

Dacă aveți de gând pentru a face mai multe cereri, ar trebui să re-folosi HttpClient exemplu. A se vedea această întrebare și răspunsuri pentru mai multe detalii despre ce o folosesc declarație nu a fost folosit pe HttpClient exemplu în acest caz: https://stackoverflow.com/questions/15705092/do-httpclient-and-httpclienthandler-have-to-be-disposed

Pentru mai multe detalii, inclusiv alte exemple, du-te aici: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

Acest blog poate fi, de asemenea, util: http://johnnycode.com/2012/02/23/consuming-your-own-asp-net-web-api-rest-service/

Comentarii (20)

Sugestia mea ar fi să utilizați RestSharp. Puteți efectua apeluri la RESTUL serviciilor și le-au aruncat în POCO obiecte cu foarte puțin cod șabloane pentru a avea de fapt pentru a analiza prin răspunsul. Acest lucru nu va rezolva special de eroare, dar răspunsurile dumneavoastră generală întrebarea cum de a face apeluri la RESTUL serviciilor. A schimba codul de a utiliza ar trebui să plătească în ușurința de utilizare și robustețea în mișcare înainte. Care este de doar 2 cenți, deși

Comentarii (10)

Fără nici o legătură, am'm sigur, dar nu înfășurați ta IDisposable obiecte în "folosind" blocuri pentru a asigura buna dispozitie:

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

        }
    }
}
Comentarii (3)

Vă rugăm să folosiți codul de mai jos pentru REST api cerere

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;
            }
        }
    }
}
Comentarii (3)

Aici sunt câteva moduri diferite de asteptare un API extern în C# (actualizat 2019).

.NET's built-in moduri:

  • WebRequest& WebClient - verbose Api-uri & Microsoft's documentație nu este foarte ușor de urmat
  • HttpClient - .NET's cel mai nou copil de pe bloc & mult mai simplu de utilizat decât de mai sus.

Gratuit, open-source Pachete NuGet, care, sincer, au o mult mai bine producător experiență mult .NET's construit în clienți:

  • ServiceStack.Text (1k github stele, 7m Nuget descărcări) (*) - rapid, ușor și rezistent.
  • RestSharp (6k github stele, 23 mn Nuget Descărcări) (*) - simplu de ODIHNĂ și HTTP API Client
  • Flurl (1.7 k github stele, 3m Nuget Descărcări) (*)- fluent, portabil, testabile HTTP client library

Toate pachetele de mai sus oferă o mare producător de experiență (de exemplu, concis, ușor de API) și sunt bine întreținute.

*()** în August 2019

Exemplu: Noțiuni de bază un element Todo de la un Fals Rest API folosind ServiceStack.Text. Alte biblioteci au sintaxă foarte asemănătoare.

class Program
{
    static void Main(string[] args)
    {
        // fake rest API
        string url = "https://jsonplaceholder.typicode.com/todos/1";

        // GET data from api & map to Poco
        var todo =  url.GetJsonFromUrl().FromJson();

        // print result to screen
        todo.PrintDump();
    }
    public class Todo
    {
        public int UserId { get; set; }
        public int Id { get; set; }
        public string Title { get; set; }
        public bool Completed { get; set; }
    }

}

Rularea exemplul de mai sus într-un .NET Core Consolă aplicație, produce următoarea ieșire.

Instala aceste pachete folosind NuGet

Install-Package ServiceStack.Text, or

Install-Package RestSharp, or

Install-Package Flurl.Http
Comentarii (0)

Actualizare pentru asteptare un REST API atunci când se utilizează .NET 4.5 sau .NET Core

Aș sugera DalSoft.RestClient (avertisment l-am creat). Motivul fiind că acesta utilizează dinamice puteți încadra totul într-un singur fluent apel, inclusiv serializarea/deserializarea. Mai jos este un lucru PUS de exemplu:

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);
Comentarii (0)

Aș dori să-mi împart soluție în ASP.NET Core

using Newtonsoft.Json;
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;

namespace WebApp
{
    public static class HttpHelper
    {
        // In my case this is https://localhost:44366/
        private static readonly string apiBasicUri = ConfigurationManager.AppSettings["apiBasicUri"];

        public static async Task Post(string url, T contentValue)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(apiBasicUri);
                var content = new StringContent(JsonConvert.SerializeObject(contentValue), Encoding.UTF8, "application/json");
                var result = await client.PostAsync(url, content);
                result.EnsureSuccessStatusCode();
            }
        }

        public static async Task Put(string url, T stringValue)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(apiBasicUri);
                var content = new StringContent(JsonConvert.SerializeObject(stringValue), Encoding.UTF8, "application/json");
                var result = await client.PutAsync(url, content);
                result.EnsureSuccessStatusCode();
            }
        }

        public static async Task Get(string url)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(apiBasicUri);
                var result = await client.GetAsync(url);
                result.EnsureSuccessStatusCode();
                string resultContentString = await result.Content.ReadAsStringAsync();
                T resultContent = JsonConvert.DeserializeObject(resultContentString);
                return resultContent;
            }
        }

        public static async Task Delete(string url)
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(apiBasicUri);
                var result = await client.DeleteAsync(url);
                result.EnsureSuccessStatusCode();
            }
        }
    }
}

Pentru a posta folosi ceva de genul asta:

await HttpHelper.Post($"/api/values/{id}", setting);

Exemplu pentru a șterge:

await HttpHelper.Delete($"/api/values/{id}");

Exemplu pentru a obține lista:

List claimTerms = await HttpHelper.Get("/api/values/");

Exemplu pentru a obține o singură:

ClaimTerm processedClaimImage = await HttpHelper.Get($"/api/values/{id}");
Comentarii (0)

OBȚINE:

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

Notă: Pentru a serializa și desirialze JSON am folosit Newtonsoft.Json pachete NuGet.

Comentarii (0)

Check out Refit pentru a face apeluri la restul serviciilor din .net. Am'am găsit-o foarte ușor de utilizat: https://github.com/paulcbetts/refit

Refit: automat tip-în condiții de siguranță RESTUL bibliotecă .NET Core, Xamarin și .NET

Refit este o bibliotecă puternic inspirat de Metri's Retrofit bibliotecă, și acesta transformă REST API într-o interfață:

public interface IGitHubApi {
        [Get("/users/{user}")]
        Task GetUser(string 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");
Comentarii (2)

Acesta este un exemplu de cod care funcționează sigur. Mi-a luat o zi pentru a face acest lucru pentru a citi un set de obiect din Restul de servicii:

RootObject este tipul de obiect Im lectură de restul serviciu.

string url = @"http://restcountries.eu/rest/v1";
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(IEnumerable));
WebClient syncClient = new WebClient();
string content = syncClient.DownloadString(url);

using (MemoryStream memo = new MemoryStream(Encoding.Unicode.GetBytes(content)))
{
    IEnumerable countries = (IEnumerable)serializer.ReadObject(memo);    
}

Console.Read();
Comentarii (0)
    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=@"passing parameters";
    string 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());
    string response = stredr.ReadToEnd();
Comentarii (0)

Am făcut-O în acest mod simplu, cu Api web 2.0. Puteți elimina UseDefaultCredentials.Am folosit-o pentru uzul meu de cazuri.

            List listObjects = new List();

            string response = "";
            using (var client = new WebClient() { UseDefaultCredentials = true })
            {
                 response = client.DownloadString(apiUrl);
            }

            listObjects = JsonConvert.DeserializeObject(response);
            return listObjects ;
Comentarii (0)

Din moment ce sunt utilizați Visual Studio 11 Beta, veți dori să utilizați cele mai recente și mai mare. Noul Api Web conține clase pentru acest lucru.

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

Comentarii (0)

primul pas este de a crea helper class for http client.

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

    }
}

Apoi, puteți utiliza această clasă în cod.

acesta este un exemplu de cum suna restul api fără purtător folosind o clasa mai sus.

// GET api/values
[HttpGet]
public async Task 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());
    else
        return NotFound();
}

acesta este un exemplu de cum poti numi rest api care necesită purtător.

// GET api/values
[HttpGet]
public async Task 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();
}

de asemenea, puteți să consultați mai jos repo dacă doriți să vedeți de lucru exemplu de cum funcționează.

https://github.com/mokh223/callApi

Comentarii (0)