Download PDF-Datei vom API Mit C#
Ich bin eine Konsolenanwendung erstellen, die
- Verbindet auf eine Hersteller-API zu ziehen-Gutschein zahlen für eingereichte Kosten zwischen zwei Datumsangaben und
- Downloads eine PDF-Kopie der Quittungen vorgelegt mit den Kosten
Den ersten Teil habe ich gut funktioniert. Ich bin in der Lage zu verbinden, um die Anbieter-API und analysiert das zurückgegebene XML zu erstellen, die ein array von Gutschein-Nummern (benötigt, um die PDF-Bilder) mit dem folgenden code:
static async Task RunAsyncCR()
{
using (var client = new HttpClient())
{
var values = new Dictionary<string, string>
{
{"un","SomeUser"},
{"pw","SomePassword"},
{"method","getVoucherInvoices"},
{"fromDate","05/30/2016"},
{"toDate", "06/13/2016"}
};
var content = new FormUrlEncodedContent(values);
Console.WriteLine("Connecting...");
var response = await client.PostAsync("https://www.chromeriver.com/receipts/doit", content);
Console.WriteLine("Connected...");
var responseString = await response.Content.ReadAsStringAsync();
char[] DelimiterChars = {'<'};
String[] xmlReturn = responseString.Split(DelimiterChars);
string[] VoucherNumber = new string[500];
int i = 0;
foreach (string s in xmlReturn)
{
if (s.Contains("voucherInvoice>") && s != "/voucherInvoice>\n ")
{
VoucherNumber[i] = s.Substring(15, 16);
i++;
}
}
Array.Resize(ref VoucherNumber, i);
Ja, es ist wahrscheinlich ein besserer Weg, dies zu tun, aber es funktioniert und gibt die Werte aus, die ich erwarte.
Nun, was ich bin Probleme mit, wenn ich die Verbindung zu der API zum abrufen der Datei, ich kann nicht scheinen zu können, laden Sie die Datei in einem bestimmten Pfad.
Kann ich die Verbindung zu der API mit
i = 0;
foreach (string x in VoucherNumber)
{
Console.WriteLine("Get receipt: " + x);
var NewValues = new Dictionary<string, string>
{
{"un","SomeUser"},
{"pw","SomePassword"},
{"method","getReceiptsWithCoverPage"},
{"voucherInvoiceForPdf", VoucherNumber[i]}
};
var NewContent = new FormUrlEncodedContent(NewValues);
var NewResponse = await client.PostAsync("https://www.chromeriver.com/receipts/doit", NewContent);
string NewResponseString = await NewResponse.Content.ReadAsStringAsync();
Aber ich kann nicht scheinen, um zu schreiben die Antwort auf eine gültige Datei (PDF)
Hier ist ein screen shot von meinen Autos-Fenster, wie ich Schritt für Schritt durch den code, wo ich brauchen würde um die Datei zu downloaden:
Meine Frage ist, ab diesem Punkt, wie kann ich das speichern der Datei auf meinem system?
Habe ich versucht, die kodierte Antwort, die ich bekommen aus tun Console.WriteLine(NewResponseString);
und schreiben es in eine Datei mit der System.IO.File.WriteAllLines()
Methode, mit einer angegebenen Dateipfad/- name, aber diese Ergebnisse in eine leere Datei. Ich habe auch einige Zeit damit verbracht, die Erforschung der tiefen von Google/Stackoverflow, verstehe aber nicht, wie die Umsetzung der Ergebnisse, finde ich.
Jegliche Hilfe würde sehr geschätzt werden.
- Können Sie fügen Sie den ersten ~20 Byte stream in hexadezimaler hier?
- Sie haben Erfahrung im Umgang mit Streams? Wenn nicht, dass ist, wo Sie beginnen sollte. Wenn das nicht Ihre Frage vielleicht klären können - benötigen Sie Hilfe speichern einer stream-to-disk oder brauchen Sie Hilfe Extraktion der stream/byte-array aus der Antwort?
- Ich habe keine Erfahrung in der Arbeit mit streams - dies ist das erste mal, dass ich jemals benötigt, um eine Verbindung zu einer API zum abrufen einer Datei...
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, ich glaube, Sie brauchen Hilfe mit Streams. Die zurückgegebenen
HttpContent
ist eigentlich einSystem.Net.Http.StreamContent
Beispiel, das zeigt, dass Sie auch Inhalte zurück. Es ist nur eine Frage der Streams (Inhalt) aus der Instanz und dem speichern dieser in eine Datei.Ich respektvoll empfehlen, dass Sie ein wenig Lesen auf, wie Streams funktionieren. Dies ist ein häufiges Konstrukt in vielen Sprachen, die Sie wahrscheinlich zu tun haben wieder in der nahen Zukunft.
Flush
Betrieb? Ist es nicht redundant?Zuerst von allen, sind Sie sicher, dass es eine Datei gibt, um mit zu beginnen? Kann ich empfehlen die Verwendung der open source Bibliothek PdfSharp. Ich persönlich verwende es selbst und es funktioniert Super. Soweit Download der Datei, vielleicht kann Sie helfen...
Download Synchron
http://www.csharp-examples.net/download-files/
Zuerst Erstellen StreamReader aus NewResponse
Definieren Sie dann eine StremaWriter zum schreiben in eine Datei.
Alternativer Ansatz ist
Verwenden Sie diesen code für den download der pdf-Datei von der API. Es konvertiert die string-Daten zu Byte und bieten Ihnen die notwendige Lösung.