Oto kod, który mam do tej pory:
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);
}
}
}
}
Problem polega na tym, że myślę, że uruchamiany jest blok wyjątków (ponieważ gdy usuwam try-catch, pojawia się komunikat o błędzie serwera (500). Ale nie widzę konsoli. Linie wstawiam w bloku catch.
Moja konsola:
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).
Używam Visual Studio 2011 Beta i .NET 4.5 Beta.
Odpowiedzi:
Interfejs API sieci Web ASP.Net zastąpił wcześniej wspomniany interfejs API sieci WCF.
Pomyślałem, że opublikuję zaktualizowaną odpowiedź, ponieważ większość tych odpowiedzi pochodzi z początku 2012 r., A ten wątek jest jednym z najlepszych wyników podczas wyszukiwania w Google hasła „zadzwoń do usługi odpoczynku c #”.
Obecne wskazówki od Microsoft to korzystanie z bibliotek klienta Microsoft ASP.NET Web API do korzystania z usługi RESTful. Jest on dostępny jako pakiet NuGet, Microsoft.AspNet.WebApi.Client. Musisz dodać ten pakiet NuGet do swojego rozwiązania.
Oto jak wyglądałby twój przykład po wdrożeniu przy użyciu biblioteki klienta ASP.Net Web API:
Jeśli planujesz składać wiele żądań, powinieneś ponownie użyć instancji HttpClient. Zobacz to pytanie i jego odpowiedzi, aby uzyskać więcej informacji na temat tego, dlaczego w wystąpieniu HttpClient nie użyto instrukcji using: Czy HttpClient i HttpClientHandler muszą zostać usunięte?
Aby uzyskać więcej informacji, w tym inne przykłady, przejdź tutaj: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client
Ten post na blogu może być również przydatny: http://johnnycode.com/2012/02/23/consuming-your-own-asp-net-web-api-rest-service/
źródło
ReadAsAsync()
, dodaj odwołanie doSystem.Net.Http.Formatting.dll
. (Intuicyjny, prawda?)Moją sugestią byłoby użycie RestSharp . Możesz nawiązywać połączenia z usługami REST i zlecać ich rzutowanie na obiekty POCO z bardzo małym kodem wzorcowym, aby faktycznie musiały zostać przeanalizowane przez odpowiedź. To nie rozwiąże konkretnego błędu, ale odpowiada na ogólne pytanie, jak wykonywać połączenia z usługami REST. Konieczność zmiany kodu, aby go używać, powinna się opłacić w łatwości użytkowania i niezawodności. To tylko moje 2 centy
Przykład:
źródło
Niepowiązane, jestem pewien, ale owiń
IDisposable
obiekty wusing
bloki, aby zapewnić właściwą utylizację:źródło
Oto kilka różnych sposobów wywoływania zewnętrznego interfejsu API w języku C # (aktualizacja 2019).
Wbudowane sposoby .NET:
Darmowe pakiety NuGet typu open source , które szczerze mówiąc mają znacznie lepsze wrażenia programistyczne niż wbudowani klienci .NET:
Wszystkie powyższe pakiety zapewniają doskonałe wrażenia programistyczne (tj. Zwięzłe, łatwe API) i są dobrze utrzymane.
(*) na sierpień 2019 r
Przykład: pobieranie elementu czynności do wykonania z interfejsu API fałszywego odpoczynku za pomocą ServiceStack.Text. Pozostałe biblioteki mają bardzo podobną składnię.
Uruchomienie powyższego przykładu w aplikacji .NET Core Console daje następujące wyniki.
Zainstaluj te pakiety za pomocą NuGet
źródło
Użyj poniższego kodu do żądania interfejsu API REST
źródło
Chciałbym udostępnić moje rozwiązanie w programie ASP.NET Core
Aby opublikować, użyj czegoś takiego:
Przykład usunięcia:
Przykład, aby uzyskać listę:
Przykład uzyskania tylko jednego:
źródło
Aktualizacja do wywoływania interfejsu API REST podczas korzystania z .NET 4.5 lub .NET Core
Sugerowałbym DalSoft.RestClient (zastrzeżenie, że go stworzyłem). Ponieważ używa dynamicznego pisania, możesz wszystko zawrzeć w jednym płynnym wywołaniu, w tym serializacji / deserializacji. Poniżej znajduje się działający przykład PUT:
źródło
DOSTAĆ:
POCZTA:
Uwaga: Do serializacji i pragnienia JSON użyłem pakietu Newtonsoft.Json NuGet.
źródło
Sprawdź Refit do nawiązywania połączeń z usługami odpoczynku z .net. Uważam, że jest bardzo łatwy w użyciu: https://github.com/paulcbetts/refit
źródło
To jest przykładowy kod, który na pewno działa. Zajęło mi dzień, aby to zrobić, aby odczytać zestaw obiektów z usługi Rest:
RootObject to typ obiektu, który czytam z usługi rest.
źródło
źródło
Zrobiłem to w prosty sposób, dzięki web Api 2.0. Możesz usunąć UseDefaultCredentials.I użyłem go do moich własnych przypadków użycia.
źródło
Ponieważ używasz Visual Studio 11 Beta, będziesz chciał korzystać z najnowszych i najlepszych. Nowy interfejs API zawiera klasy do tego.
Zobacz HttpClient: http://wcf.codeplex.com/wikipage?title=WCF%20HTTP
źródło
Zaznaczona tutaj odpowiedź sugeruje użycie HttpClient bezpośrednio i usunięcie go. To może działać, ale dość łatwo wpaść w problemy z HttpClient, jeśli nie używasz go poprawnie. Jeśli zamierzasz używać HttpClient, lepiej oddać tworzenie / usuwanie HttpClients bibliotece innej firmy, która używa wzorca fabrycznego. RestClient.Net jest jedną z takich bibliotek.
Ma bardzo podstawową fabrykę HttpClient, dzięki czemu nie napotykasz problemu wyczerpania gniazda,
Ale implementacja Microsoft IHttpClientFactory może być również używana do najnowszych i najlepszych:
RestClient.Net bierze pod uwagę wstrzykiwanie zależności konta, kpiny, kontenery IoC, testowanie jednostek, a przede wszystkim jest szybkie. Polowałem wokoło, a jedynym innym klientem, który wydaje się działać z podobną wydajnością, jest Flurl
źródło
pierwszym krokiem jest utworzenie klasy pomocniczej dla klienta http.
Następnie możesz użyć tej klasy w swoim kodzie.
jest to przykład tego, jak wywołać resztę interfejsu API bez nośnika przy użyciu powyższej klasy.
jest to przykład tego, jak można wywołać pozostałe API, które wymagają okaziciela.
możesz również zapoznać się z poniższym repozytorium, jeśli chcesz zobaczyć działający przykład jego działania.
https://github.com/mokh223/callApi
źródło