Dies ist der Code, den ich bisher habe:
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);
}
}
}
}
Das Problem ist, dass ich denke, dass der Ausnahmeblock ausgelöst wird (denn wenn ich den try-catch entferne, erhalte ich eine Serverfehlermeldung (500). Aber ich sehe die Console.Out-Zeilen, die ich in den catch-Block eingefügt habe, nicht.
Meine Konsole:
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).
Ich verwende Visual Studio 2011 Beta und .NET 4.5 Beta.
Antworten:
Die ASP.Net-Web-API hat die zuvor erwähnte WCF-Web-API ersetzt.
Ich dachte, ich würde eine aktualisierte Antwort veröffentlichen, da die meisten dieser Antworten von Anfang 2012 stammen. Dieser Thread ist eines der Top-Ergebnisse bei einer Google-Suche nach "Call Restful Service C #".
Derzeit wird von Microsoft empfohlen, die Microsoft ASP.NET-Web-API-Clientbibliotheken zu verwenden, um einen RESTful-Dienst zu nutzen. Dies ist als NuGet-Paket Microsoft.AspNet.WebApi.Client verfügbar. Sie müssen dieses NuGet-Paket zu Ihrer Lösung hinzufügen.
So würde Ihr Beispiel aussehen, wenn es mit der ASP.Net Web API Client Library implementiert wird:
Wenn Sie mehrere Anforderungen stellen möchten, sollten Sie Ihre HttpClient-Instanz erneut verwenden. In dieser Frage und ihren Antworten finden Sie weitere Informationen dazu, warum in diesem Fall keine using-Anweisung für die HttpClient-Instanz verwendet wurde: Müssen HttpClient und HttpClientHandler entsorgt werden?
Weitere Informationen, einschließlich anderer Beispiele, finden Sie hier: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client
Dieser Blog-Beitrag kann auch nützlich sein: http://johnnycode.com/2012/02/23/consuming-your-own-asp-net-web-api-rest-service/
quelle
ReadAsAsync()
, fügen Sie einen Verweis auf hinzuSystem.Net.Http.Formatting.dll
. (Intuitiv, richtig?)Mein Vorschlag wäre, RestSharp zu verwenden . Sie können REST-Services aufrufen und sie mit sehr wenig Code in POCO-Objekte umwandeln lassen, um die Antwort tatsächlich analysieren zu müssen. Dies löst nicht Ihren speziellen Fehler, sondern beantwortet Ihre allgemeine Frage, wie Sie REST-Services anrufen können. Wenn Sie Ihren Code ändern müssen, um ihn verwenden zu können, sollte sich dies in der Benutzerfreundlichkeit und Robustheit der Zukunft auszahlen. Das sind aber nur meine 2 Cent
Beispiel:
quelle
Ich bin mir sicher, dass Sie nichts damit zu tun haben, aber wickeln Sie Ihre
IDisposable
Objekte inusing
Blöcke, um eine ordnungsgemäße Entsorgung zu gewährleisten:quelle
Hier sind einige verschiedene Möglichkeiten zum Aufrufen einer externen API in C # (aktualisiert 2019).
Integrierte Möglichkeiten von .NET:
Kostenlose Open-Source-NuGet-Pakete , die offen gesagt eine viel bessere Entwicklererfahrung bieten als die in .NET integrierten Clients:
Alle oben genannten Pakete bieten eine großartige Entwicklererfahrung (dh eine übersichtliche, einfache API) und sind gut gepflegt.
(*) Stand August 2019
Beispiel: Abrufen eines Todo-Elements von einer Fake Rest-API mithilfe von ServiceStack.Text. Die anderen Bibliotheken haben eine sehr ähnliche Syntax.
Wenn Sie das obige Beispiel in einer .NET Core Console-App ausführen, wird die folgende Ausgabe erzeugt.
Installieren Sie diese Pakete mit NuGet
quelle
Bitte verwenden Sie den folgenden Code für Ihre REST-API-Anfrage
quelle
Ich möchte meine Lösung in ASP.NET Core freigeben
Um etwas zu posten, benutze so etwas:
Beispiel zum Löschen:
Beispiel, um eine Liste zu erhalten:
Beispiel, um nur eines zu erhalten:
quelle
Update zum Aufrufen einer REST-API bei Verwendung von .NET 4.5 oder .NET Core
Ich würde DalSoft.RestClient vorschlagen (Einschränkung, die ich erstellt habe). Der Grund dafür ist, dass Sie mithilfe der dynamischen Typisierung alles in einem fließenden Aufruf zusammenfassen können, einschließlich Serialisierung / De-Serialisierung. Unten sehen Sie ein funktionierendes PUT-Beispiel:
quelle
ERHALTEN:
POST:
Hinweis: Zum Serialisieren und Desirialisieren von JSON habe ich das NewGonsoft.Json NuGet-Paket verwendet.
quelle
Schauen Sie sich Refit an, um Anrufe zu Restdiensten von .net zu tätigen. Ich fand es sehr einfach zu bedienen: https://github.com/paulcbetts/refit
quelle
Dies ist ein Beispielcode, der sicher funktioniert. Ich habe einen Tag gebraucht, um eine Reihe von Objekten aus dem Rest-Service zu lesen:
RootObject ist der Typ des Objekts, das ich vom Restdienst lese.
quelle
quelle
Ich habe es auf diese einfache Weise mit Web Api 2.0 gemacht. Sie können UseDefaultCredentials entfernen. Ich habe es für meine eigenen Anwendungsfälle verwendet.
quelle
Da Sie Visual Studio 11 Beta verwenden, möchten Sie die neuesten und besten verwenden. Die neue Web-API enthält hierfür Klassen.
Siehe HttpClient: http://wcf.codeplex.com/wikipage?title=WCF%20HTTP
quelle
Die hier markierte Antwort schlägt vor, HttpClient direkt zu verwenden und zu entsorgen. Dies mag funktionieren, aber es ist ziemlich einfach, auf Probleme mit HttpClient zu stoßen, wenn Sie es nicht richtig verwenden. Wenn Sie HttpClient verwenden, sollten Sie die Erstellung / Entsorgung von HttpClients besser an eine Bibliothek eines Drittanbieters übergeben, die das Factory-Muster verwendet. RestClient.Net ist eine solche Bibliothek.
Es wird mit einer sehr einfachen HttpClient-Factory geliefert, damit Sie nicht auf das Problem der Socket-Erschöpfung stoßen.
Die IHttpClientFactory-Implementierung von Microsoft kann jedoch auch für die neuesten und besten Anwendungen verwendet werden:
RestClient.Net berücksichtigt Abhängigkeitsinjektion, Verspottung, IoC-Container, Testbarkeit von Einheiten und ist vor allem schnell. Ich habe herumgejagt und der einzige andere Client, der in einer ähnlichen Funktion zu arbeiten scheint, ist Flurl.Http
quelle
Der erste Schritt besteht darin, die Hilfsklasse für den http-Client zu erstellen.
Dann können Sie diese Klasse in Ihrem Code verwenden.
Dies ist ein Beispiel dafür, wie Sie die restliche API ohne Träger mit der obigen Klasse aufrufen.
Dies ist ein Beispiel dafür, wie Sie den Rest API nennen können, für den ein Inhaber erforderlich ist.
Sie können sich auch auf das folgende Repo beziehen, wenn Sie das Arbeitsbeispiel für die Funktionsweise sehen möchten.
https://github.com/mokh223/callApi
quelle