Ich versuche, eine Verbindung zu einer API herzustellen, die GZip-codiertes JSON von einem WCF-Dienst (WCF-Dienst zu WCF-Dienst) zurückgibt. Ich verwende den HTTPClient , um eine Verbindung zur API herzustellen , und konnte das JSON-Objekt als Zeichenfolge zurückgeben. Ich muss jedoch in der Lage sein, diese zurückgegebenen Daten in einer Datenbank zu speichern, und als solche dachte ich, der beste Weg wäre, das JSON-Objekt in einem Array oder Byte oder etwas in dieser Richtung zurückzugeben und zu speichern.
Ich habe speziell Probleme mit der Dekomprimierung der GZip-Codierung und habe viele verschiedene Beispiele ausprobiert, kann sie aber immer noch nicht verstehen.
Mit dem folgenden Code stelle ich meine Verbindung her und erhalte eine Antwort. Dies ist der Code, der eine Zeichenfolge von der API zurückgibt.
public string getData(string foo)
{
string url = "";
HttpClient client = new HttpClient();
HttpResponseMessage response;
string responseJsonContent;
try
{
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
response = client.GetAsync(url + foo).Result;
responseJsonContent = response.Content.ReadAsStringAsync().Result;
return responseJsonContent;
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
return "";
}
}
Ich habe einige verschiedene Beispiele wie diese StackExchange-API , MSDN und einige Beispiele zum Stackoverflow verfolgt, aber ich konnte keines davon für mich zum Laufen bringen.
Was ist der beste Weg, um dies zu erreichen? Bin ich überhaupt auf dem richtigen Weg?
Danke Leute.
Antworten:
Instanziieren Sie HttpClient einfach so:
Update 19. Juni 2020: Es wird nicht empfohlen, httpclient in einem "using" -Block zu verwenden, da dies zu einer Erschöpfung des Ports führen kann.
Wenn Sie .Net Core 2.1+ verwenden, sollten Sie IHttpClientFactory verwenden und wie folgt in Ihren Startcode einfügen.
quelle
HttpClient
Sollte NICHT im Inneren verwendet werdenusing
Ich habe Code von unten verwendet, um den GZip-Stream zu dekomprimieren. Dann habe ich das dekomprimierte Byte-Array verwendet, um das erforderliche JSON-Objekt zu erhalten. Hoffe, es kann jemandem helfen.
https://www.dotnetperls.com/decompress
quelle
Ok, also habe ich mein Problem gelöst. Wenn es bessere Möglichkeiten gibt, lass es mich wissen :-)
Das RootObject enthält die get-Menge, die die Werte des JSON abruft.
Der einfachste Weg, die oben genannten Klassen zu erstellen, ist die Verwendung von json2charp, das sie entsprechend formatiert und auch die richtigen Datentypen bereitstellt.
Das Folgende ist aus einer anderen Antwort auf Stackoverflow , die verschachtelten JSON nicht berücksichtigt.
Um schließlich das obige Dataset in eine Tabelle mit Spalten einzufügen, die dem JSON zugeordnet wurden, habe ich eine SQL-Massenkopie und die folgende Klasse verwendet
Das obige funktioniert also, um JSON von einer WebAPI in eine Datenbank einzufügen. Das ist etwas, was ich zur Arbeit bekomme. Aber ich erwarte keineswegs, dass es perfekt ist. Wenn Sie Verbesserungen haben, aktualisieren Sie diese bitte entsprechend.
quelle
HttpClient
und IhrHttpResponse
innerhalb einerusing()
Anweisung jeweils eine ordnungsgemäße, fristgerechte Entsorgung und Schließen der zugrunde liegenden Ströme.