Abrufen von JSON Daten von einer Web-API

  • VB.NET

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Also ich habe das jetzt mit einem Random UserAgent gemacht, klappte. hatte aber noch einen Fehler in meinem Code, hatte einfach vergessen api_key= in der Funktion zum bilden der Url-parameter vergessen und ein & anstatt ein ? für den ersten parameter. Kam direkt Meldung wegen des Fehlenden Api-Keys.

    VB.NET-Quellcode

    1. Dim urlParams As String = $"?api_key={apiKey}"

    kafffee schrieb:

    Hast du da einfach "VB.NET App"

    Nein, ich habe einfach eine Domain dort eingetragen. Im User-Agent-Header kann grundsätzlich stehen was will, aber er ist dazu gedacht, dass ein (Web)Server die Anwendung/Client identifizieren kann.
    Wenn dich jemand fremdes auf der Straße anspricht und sich dabei nicht zu erkennen gibt oder seinen Namen sagt, den ignorierst du doch auch. ;)

    kafffee schrieb:

    da steht irgendwas mit "Header Parameter", was ich so aber nicht verstanden hab...

    du fügst einfach einen Header mit diesen Namen hinzu, der Wert muss dann der Api key sein.

    beim HttpClient
    client.DefaultRequestHeaders.Add("X-API-KEY", "dein API key")

    Ein wenig Hintergrund, wenn du übers HTTP-Protokoll einen Anfrage an einen Server sendest, schreibt du einen Text dorthin, die ersten Teilen sind die Header, damit kannst du Einstellungen vornehmen für die Kommunikation, wie Conection keep-alive, den Webserver anweisen nicht zu tracken, ("DNT: 1"), oder eine Kompressionsmethode festlegen ("Accept-Encoding: gzip, deflate, br"), oft kommt gzip und deflate zum Einsatz br(Brotli) habe ich glaube ich weniger gesehen. Aber auch sagen das und das akzeptiere ich(MIME-Typen), Dann wertet der Webserver die Header-Zeilen aus und schreibt dir eine Antwort, in der Regel schreibt er dir dann die Webseite zurück, kann aber wie hier auch JSON sein oder XML, ein Webserver kann dir jede Art von Datei oder Daten in diversen Formen servieren.

    Auch wenn man einen POST request macht, sind die Variablen-Namen und Werte wie die Header übertragen, beim GET nutzt man Url-Parameter.
    So bei mir funktionierts jetzt auch wie gewünscht.

    Nur beim Deserialisieren hab ich noch ein kleines Problem. Er spuckt mir die Properties als Nullen bzw. leere Strings aus und ich weiss nicht warum. Hab das so gemacht:

    VB.NET-Quellcode

    1. Public Class SongInfo
    2. Public Sub New()
    3. End Sub
    4. Public Property song_id As String
    5. Public Property song_title As String
    6. Public Property song_uri As String
    7. Public Property tempo As Integer
    8. Public Property time_sig As Integer
    9. Public Property key_of As String
    10. Public Property camelot As String
    11. Public Property artist As Array
    12. Public Property album As Array
    13. End Class


    VB.NET-Quellcode

    1. Dim Ergebnis As SongInfo
    2. Ergebnis = JsonConvert.DeserializeObject(Of SongInfo)(responseString)
    3. TextBox1.Text = "Tonart: " & Ergebnis.key_of & Environment.NewLine & "BPM: " & Ergebnis.tempo & Environment.NewLine

    ISliceUrPanties schrieb:

    Aber um es kurz zu machen, deine Properties stimmen nicht mit den Namen im Json überein.


    Bist du dir da sicher? Ich hab nicht, wie in deinem Beispiel, eine type=artist-Abfrage gemacht, sondern mit type=both und bekomme folgenden String, da stimmen die Namen doch überein, oder?

    Spoiler anzeigen
    {"search":[{"song_id":"rRy8EB","song_title":"Beat It","song_uri":"https:\/\/getsongbpm.com\/song\/beat-it\/rRy8EB","tempo":"136","time_sig":"4\/4","key_of":"D\u266fm","open_key":"7m","artist":{"id":"GQ3","name":"Michael Jackson","uri":"https:\/\/getsongbpm.com\/artist\/michael-jackson\/GQ3","img":"https:\/\/i.scdn.co\/image\/51dad9aaabe5643818840207a9a8957c2ad91bf2","genres":["funk","pop","rock","soul"],"from":"US","mbid":"f27ec8db-af05-4f36-916e-3d57f91ecf5e"},"album":{"title":"Thriller","uri":"https:\/\/getsongbpm.com\/album\/thriller\/xgR9","img":"https:\/\/i.scdn.co\/image\/ab67616d00001e024121faee8df82c526cbab2be","year":"1982"}},{"song_id":"QkozJq","song_title":"Beat It \/ State of Shock - Immortal Version","song_uri":"https:\/\/getsongbpm.com\/song\/beat-it-state-of-shock-immortal-version\/QkozJq","tempo":"138","time_sig":"4\/4","key_of":"C\u266f","open_key":"8d","artist":{"id":"GQ3","name":"Michael Jackson","uri":"https:\/\/getsongbpm.com\/artist\/michael-jackson\/GQ3","img":"https:\/\/i.scdn.co\/image\/51dad9aaabe5643818840207a9a8957c2ad91bf2","genres":["funk","pop","rock","soul"],"from":"US","mbid":"f27ec8db-af05-4f36-916e-3d57f91ecf5e"},"album":{"title":"Immortal","uri":"https:\/\/getsongbpm.com\/album\/immortal\/8xz1o","img":"https:\/\/i.scdn.co\/image\/ab67616d00001e0242d5a048a254a1ca50e85715","year":"2019"}}]}


    In den Docs findest du dieses Objekt unter Responses>search Object>Both Query.

    Wo ich mir aber noch unsicher bin, ist die Property album und artist. Das soll je jeweils ein Array sein bzw. steht da auch unter artist "See Artist Object", sollte ich also auch noch ein Artist-Objekt mit rein nehmen?

    Aber mit meinem JsonConvert.DeserializeObject liege ich da überhaupt richtig? Wenn ich das so mache, wie in dem verlinkten Post von dir, also JsonSerializer.Deserialize, dann bekomme ich den Fehler:

    Der Wert vom Typ "String" kann nicht in "JsonReader" konvertiert werden....
    Deine Klasse passt überhaupt nicht. Search ist ein JsonArray, gibt von einem Song auch mal verschiedene Versionen, so kann der SearchRequest auch mal mehrere Songs liefern.
    So sehen bei mir die Klassen aus, du brauchst in diesem Fall mehrere.

    VB.NET-Quellcode

    1. Public Class Album
    2. Public Property title As String
    3. Public Property uri As String
    4. Public Property img As String
    5. Public Property year As String
    6. End Class
    7. Public Class Artist
    8. Public Property id As String
    9. Public Property name As String
    10. Public Property uri As String
    11. Public Property img As String
    12. Public Property genres As List(Of String)
    13. Public Property from As String
    14. Public Property mbid As String
    15. End Class
    16. Public Class SongInfo
    17. Public Property search As List(Of Search)
    18. End Class
    19. Public Class Search
    20. Public Property song_id As String
    21. Public Property song_title As String
    22. Public Property song_uri As String
    23. Public Property tempo As String
    24. Public Property time_sig As String
    25. Public Property key_of As String
    26. Public Property open_key As String
    27. Public Property artist As Artist
    28. Public Property album As Album
    29. End Class

    VB.NET-Quellcode

    1. Dim Ergebnis As SongInfo
    2. Ergebnis = JsonConvert.DeserializeObject(Of SongInfo)(result)
    3. If Ergebnis.search.Count > 0 Then
    4. Dim res As String = "Tonart: " & Ergebnis.search(0).key_of & Environment.NewLine & "BPM: " & Ergebnis.search(0).time_sig & Environment.NewLine
    5. MessageBox.Show(res)
    6. End If


    PS.
    @kafffee
    json2csharp.com/
    oder den JsonString ins Clipboard kopieren, im Studio oben im Menu Bearbeiten->Inhalte einfügen->Json als Klasse einfügen, aber nicht vergessen den String im Clipboard zu haben.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BitBrösel“ ()

    BitBrösel schrieb:

    oder den JsonString ins Clipboard kopieren, im Studio oben im Menu Bearbeiten->Inhalte einfügen->Json als Klasse einfügen, aber nicht vergessen den String im Clipboard zu haben.


    So einfach? Hab das jetzt mit json2csjarp.com gemacht. Da hätt ich jetzt lang rumtippen können 8o

    Die Version mit VS funktioniert aber nur mit .NET 6, sehe ich das richtig? Mein Projekt ist 4.6.1, da gab es einen solchen Eintrag im Menü nicht...

    kafffee schrieb:

    da gab es einen solchen Eintrag im Menü nicht...



    Ich bin auch noch mit Net-FX unterwegs, hab zu viele Probleme mit dem Designer mit Net 6. Du musst das aber machen wenn du eine Codedatei offen hast, im Designer funktioniert das nicht. Aber ja, so einfach kann es sein, such mal nach Json Class Generator, gibt viele davon.
    Bilder
    • Unbenannt.jpg

      66,73 kB, 680×591, 38 mal angesehen