pat.bat
Goto Top

Import von JSON-Daten ins VB.NET Projekt

Hallo zusammen,

ich möchte in meinem vb.net Projekt die aktuellen Feiertage importieren und fand folgende Website: https://feiertage-api.de/

Dort werden die Daten über JSON zur Verfügung gestellt. Vorteil ist, das ich somit immer die aktuelle Feiertage des Jahres habe.

Ich habe nun schon gesucht und probiert, aber leider noch keinen Erfolg gehabt, diese Daten in mein Projekt zu bekommen.

Als nützlich für dieses Vorhaben erweist sich wohl die Bibliothek Newtonsoft.Json.

Der Inhalt der JSON mit Filterung auf MV sieht wie folgt aus:

{"Neujahrstag":{"datum":"2016-01-01","hinweis":""},"Karfreitag":{"datum":"2016-03-25","hinweis":""},"Ostermontag":{"datum":"2016-03-28","hinweis":""},"Tag der Arbeit":{"datum":"2016-05-01","hinweis":""},"Christi Himmelfahrt":{"datum":"2016-05-05","hinweis":""},"Pfingstmontag":{"datum":"2016-05-16","hinweis":""},"Fronleichnam":{"datum":"2016-05-26","hinweis":""},"Tag der Deutschen Einheit":{"datum":"2016-10-03","hinweis":""},"Allerheiligen":{"datum":"2016-11-01","hinweis":""},"1. Weihnachtstag":{"datum":"2016-12-25","hinweis":""},"2. Weihnachtstag":{"datum":"2016-12-26","hinweis":""}}  

Über einen Button wollte ich nun die Daten auslesen:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim jsonURL As String = "https://feiertage-api.de/api/?jahr=2019&nur_land=MV"  
        Dim reader As StreamReader
        Dim errorMsg As String = Nothing

        Try
            Dim request As HttpWebRequest = CType(WebRequest.Create(jsonURL), HttpWebRequest)
            Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
            reader = New StreamReader(response.GetResponseStream())
            Dim jsonStr As String = reader.ReadToEnd()

            PrintJSON(jsonStr)
        Catch ex As WebException
            errorMsg = "Download failed. The response from the server was " +  
                CType(ex.Response, HttpWebResponse).StatusDescription
            Console.WriteLine("Error: " + errorMsg)  
        End Try
    End Sub

Ich habe mich dabei an eine Vorlage im Web gehalten.

Wenn ich nun auf den Button drücke, erscheint mir folgende Exception:

Ausnahme ausgelöst: "System.Net.WebException" in System.dll  
Error: Download failed. The response from the server was Proxy Authorization Required

Ich weiß nicht obs die Hitze im Büro ist, aber ich verstehe gerade nicht warum er eine Proxy Auth möchte :S

Dazu sei gesagt, das ich, wie man sieht, keine Erfahrung mit JSON habe und VB.Net seit ca. 1 Woche aktiv betreibe.


Ich bedanke mich schonmal für eure Zeit und Hilfe.

Grüße,
Pat

Content-Key: 466120

Url: https://administrator.de/contentid/466120

Printed on: April 19, 2024 at 11:04 o'clock

Member: SlainteMhath
SlainteMhath Jun 26, 2019 at 11:54:47 (UTC)
Goto Top
Moin,

ich bin mir nicht sicher, aber kann HttpWebRequest denn https?

lg,
Slainte
Member: Pat.bat
Pat.bat Jun 26, 2019 updated at 12:20:08 (UTC)
Goto Top
Gute Idee.

ich habe das nun umgeändert in folgendes:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf AcceptCert)

        Dim hreq As HttpWebRequest = CType(HttpWebRequest.Create("https://feiertage-api.de/api/?jahr=2019&nur_land=MV"), HttpWebRequest)  
        Dim hres As HttpWebResponse = CType(hreq.GetResponse(), HttpWebResponse)
        Dim s As Stream = hres.GetResponseStream()
        Dim sr As New StreamReader(s)
        Dim html As String = sr.ReadToEnd()

        sr.Close()
        s.Close()

        File.WriteAllText(My.Computer.FileSystem.SpecialDirectories.Desktop & "\test.txt", html)  
    End Sub

    Private Function AcceptCert(ByVal sender As Object, ByVal cert As System.Security.Cryptography.X509Certificates.X509Certificate,
                                ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain,
                                ByVal errors As System.Net.Security.SslPolicyErrors) As Boolean
        Return True
    End Function

angeblich kann man so auch https erreich, allerdings bekomme ich immer noch eine Fehlermeldung:

Der Remoteserver hat einen Fehler zurückgegeben: (407) Proxyauthentifizierung erforderlich.


zusätzliche Ergänzung:

der Betreiber der Seite schreibt noch folgendes:

Der Service ist auf beiden Protokollen zu erreichen. Die Webseite nur per https, aber der API-Endpunkt /api per http und https.
Member: Pat.bat
Pat.bat Jun 26, 2019 at 12:31:58 (UTC)
Goto Top
Nachtrag:

Habs nun hinbekommen.

ich musste noch folgendes ergänzen:

hreq.Proxy.Credentials = CredentialCache.DefaultCredentials

Jetzt muss ich nur noch die Daten richtig im Programm anzeigen und prüfen lassen, anstatt sie in eine Datei auf dem Desktop zu legen.
Member: colinardo
Solution colinardo Jun 26, 2019 updated at 12:59:33 (UTC)
Goto Top
Hello again, isch sag einfach hello again ...face-smile

Folgende Verweise zusätzlich zum Projekt hinzufügen:

  • System.Web
  • System.Web.Extensions
Imports System.Net
Imports System.Globalization
Imports System.Web.Script.Serialization

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' simplen Webclient für den Download  
        Dim client As New WebClient
        ' Download als String  
        Dim result As String = client.DownloadString("https://feiertage-api.de/api/?jahr=2019&nur_land=MV")  
        ' Serializer Objekt erstellen  
        Dim j As JavaScriptSerializer = New JavaScriptSerializer()
        ' JSON String in Objekt konvertieren  
        Dim json As Object = j.Deserialize(result, GetType(Object))
        ' Über die Items des Objects itterieren  
        For Each x As KeyValuePair(Of String, Object) In json
            ' Name des Feiertags  
            Dim strName As String = x.Key
            ' Datum des Feiertags in DateTime Objekt wandeln  
            Dim d As Date
            DateTime.TryParseExact(x.Value("datum"), "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture, DateTimeStyles.None, d)  
            ' und zur Demo ausgeben lassen  
            MsgBox(strName & " : " & d.ToString())  
        Next
    End Sub
End Class
Grüße Uwe
Member: Pat.bat
Pat.bat Jun 26, 2019 at 13:02:54 (UTC)
Goto Top
Hallo Uwe :D

leider findet er bei mir nicht die Bibliothek System.Web.Script :S
Member: colinardo
Solution colinardo Jun 26, 2019 updated at 13:11:24 (UTC)
Goto Top
Ich habe extra geschrieben das du sie erst deinem Projekt über Verweise hinzufügen musst.
und zwar
  • System.Web
und
  • System.Web.Extensions

screenshot

screenshot
Member: Pat.bat
Pat.bat Jun 26, 2019 at 13:13:59 (UTC)
Goto Top
Sorry hatte ich total überlesen.

Funktioniert nun alles einwandfrei und so "einfach" eigentlich.

Man lernt ständig dazu, danke.
Member: colinardo
colinardo Jun 26, 2019 updated at 13:15:15 (UTC)
Goto Top
Man lernt ständig dazu, danke.
Bidde. face-wink
Member: Pat.bat
Pat.bat Jun 26, 2019 updated at 13:31:22 (UTC)
Goto Top
Huch, jetzt kam doch wieder ein Problem.

habe den Code nun aus dem Button geholt und an eine ComboBox angepasst bzw. in eine private Sub gepackt die einen String übergeben haben möchte.

Dim result As String = client.DownloadString("https://feiertage-api.de/api/?jahr=" & Year & "&nur_land=MV")  

Die Methode wird immer dann aufgerufen, wenn ich ein anderes Jahr in der Kombobox selektiere. Übergeben wird das Jahr (Year) an die Methode.

Beim starten des Programmes kommt jetzt immer folgender Fehler:

System.Net.WebException
  HResult=0x80131509
  Nachricht = Der Remoteserver hat einen Fehler zurückgegeben: (407) Proxyauthentifizierung erforderlich.
  Quelle = System
  Stapelüberwachung:
   bei System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request)
   bei System.Net.WebClient.DownloadString(Uri address)
   bei System.Net.WebClient.DownloadString(String address)
   bei DatePickerProsoz.Form1.GetHolidays(String Year) in H:\Entwicklung\Zahllaufkalender\Zahllaufkalender\Zahllaufkalender\Form1.vb: Zeile243
   bei DatePickerProsoz.Form1.ComboBoxFeiertage_SelectedIndexChanged(Object sender, EventArgs e) in H:\Entwicklung\Zahllaufkalender\Zahllaufkalender\Zahllaufkalender\Form1.vb: Zeile229
   bei System.Windows.Forms.ComboBox.OnSelectedIndexChanged(EventArgs e)
   bei System.Windows.Forms.ComboBox.set_SelectedIndex(Int32 value)
   bei DatePickerProsoz.Form1.Form1_Load(Object sender, EventArgs e) in H:\Entwicklung\Zahllaufkalender\Zahllaufkalender\Zahllaufkalender\Form1.vb: Zeile62
   bei System.EventHandler.Invoke(Object sender, EventArgs e)
   bei System.Windows.Forms.Form.OnLoad(EventArgs e)
   bei System.Windows.Forms.Form.OnCreateControl()
   bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   bei System.Windows.Forms.Control.CreateControl()
   bei System.Windows.Forms.Control.WmShowWindow(Message& m)
   bei System.Windows.Forms.Control.WndProc(Message& m)
   bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   bei System.Windows.Forms.Form.WmShowWindow(Message& m)
   bei System.Windows.Forms.Form.WndProc(Message& m)
   bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Member: colinardo
Solution colinardo Jun 26, 2019 updated at 13:35:29 (UTC)
Goto Top
Der Remoteserver hat einen Fehler zurückgegeben: (407) Proxyauthentifizierung erforderlich.
Ist doch das selbe wie oben, du hast vergessen deine Proxy-Credentials über die du ins Web gehst im Webclient anzugeben. Der Client hat auch eine "Proxy"-Property!
https://docs.microsoft.com/de-de/dotnet/api/system.net.webclient.proxy?v ...
Member: Pat.bat
Pat.bat Jun 26, 2019 updated at 13:35:23 (UTC)
Goto Top
Nachtrag:

konnte ich durch folgende Ergänzung lösen :P

' Simplen Webclient für den Download  
        Dim client As New WebClient
        client.Proxy.Credentials = CredentialCache.DefaultCredentials


@colinardo Ja, das ist mir beim angucken der Fehlermeldung dann auch in den Sinn gekommen, das das bei dem WebClient ja mitgegeben werden muss ^^

Ich schiebe es mal auf die Hitze hier
Member: SlainteMhath
SlainteMhath Jun 26, 2019 at 13:43:35 (UTC)
Goto Top
konnte ich durch folgende Ergänzung lösen :P

Face<-Palm

:O
Member: colinardo
colinardo Jun 26, 2019 updated at 14:02:08 (UTC)
Goto Top
Ich schiebe es mal auf die Hitze hier
Na dann ...