REST API mit .NET Client und body-payload

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    REST API mit .NET Client und body-payload

    Hallo Leute,

    ich habe wieder ein neues Projekt wo ich eine REST-API abfrage.
    Die Antworten kommen als JSON-String retour. Das ist grundsätzlich einfach und funktioniert auch. z.B.:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Liest die Infos der Bestellung "OrderID" im JSON Format aus
    3. ''' </summary>
    4. ''' <param name="OrderID"></param>
    5. ''' <returns></returns>
    6. Public Function Get_Mergeport_SingelOrder(OrderID As String) As String
    7. Using wc As New WebClient
    8. wc.Headers.Add("Authorization", "88a21eaf-aaaa-45ea-b14e-70ecefcb03a1")
    9. wc.Headers.Add("ContentType", "application/json")
    10. Dim s As String = wc.DownloadString("https://ordering.mergeport.com/v4/pos/orders/" + OrderID)
    11. Get_Mergeport_SingelOrder = s
    12. End Using
    13. End Function


    Nun stehe ich vor der Aufgabe, dass eine API-Abfrage ein body-payload im JSON-Format mitgegeben werden soll und dann ebenfalls eine Rückmeldung im JSON-Format kommt.
    Leider konnte ich das noch nicht testen, da ich den API-Key dazu erst bekommen.
    Wäre die Abfrage mit WebClient.UploadString( statt WebClient.DownloadString korrekt?:

    VB.NET-Quellcode

    1. Public Function Set_Mergeport_OrderState(OrderID As String) As String
    2. Dim body As String = "{'state': 'acceptedByPOS'}".Replace("'", """")
    3. Using wc As New WebClient
    4. wc.Headers.Add("Authorization", "88a21eaf-aaaa-45ea-b14e-70ecefcb03a1")
    5. wc.Headers.Add("ContentType", "application/json")
    6. Dim s As String = wc.UploadString("https://ordering.mergeport.com/v4/pos/orders/" + OrderID, body)
    7. Set_Mergeport_OrderState = s
    8. End Using
    9. End Function


    *Topic verschoben*
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hallo,
    ich habs schon einige Male hier ins Forum geschrieben, aber gerne noch mal: die WebClient-Klasse soll nicht mehr verwendet werden. Steht in der Doku schön farbig da. Bitte nimm den HttpClient.
    Außerdem solltest du für deine Json-Geschichten eigene Klassen anlegen. VS kann die selbst erzeugen: Json kopieren, anschließend in einer Datei -> Edit -> Paste Special -> Paste JSON as Classes. Der HttpClient hat Erweiterungsmethoden, die einem das Arbeiten mit Json erleichtern; z.B. PostAsJsonAsync.
    @ISliceUrPantiesnull
    Schade. Nun hatte ich mir gedacht einen extrem kurzen und funktionierenden Code zu haben und nun soll man den nicht mehr verwenden.
    Ok, verstehe ich. Das schreibt Microsoft auf deren Seite. Aber ist es nicht so, dass in neuen .NET (und nach 4.8 soll ja keines mehr kommen) alle alten Funktionen immer noch unterstützt werden müssen?

    Habs mal geändert:

    VB.NET-Quellcode

    1. Public Async Sub Get_Mergeport_Orders_V2()
    2. Global_Mergeport_Response = ""
    3. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
    4. HTC.DefaultRequestHeaders.Accept.Clear()
    5. HTC.DefaultRequestHeaders.Add("ContentType", "application/json")
    6. HTC.DefaultRequestHeaders.Add("Authorization", MergePortAPI_Key)
    7. HTC.Timeout = New TimeSpan(0, 0, 5) '5 Sekunden
    8. Dim json As String = Await HTC.GetStringAsync(New Uri("https://ordering.mergeport.com/v4/pos/orders?filter=active"))
    9. Global_Mergeport_Response = json
    10. End Sub



    Übrigens vielen Dank für den Tipp mit Paste JSON as Classes ;)

    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „dive26“ ()

    Hallo,

    dive26 schrieb:

    Dim AlleDaten As CLS_MergePortOrder = JsonConvert.DeserializeObject(Of CLS_MergePortOrder)(JsonString)

    hier deserialisierst du dein Objekt doch schon. Das muss man nur einmal machen. Aber ich glaube, die Klasse [tt]CLS_MergePortOrder[tt] brauchst du nicht. Ich vermute (weil ich den Inhalt von Json-String nicht kenne) korrekter ist es mit

    VB.NET-Quellcode

    1. Dim AlleDaten As CLS_MergePortOrder = JsonConvert.DeserializeObject(Of Rootobject)(JsonString)

    Dann kannst du mit

    VB.NET-Quellcode

    1. For Each Order in AlleDaten.orders 'usw...
    auf deine Bestellungen zugreifen.
    @ISliceUrPanties

    Ich habe es jetzt so hinbekommen:

    VB.NET-Quellcode

    1. Public Sub Auswerten(JsonString As String)
    2. Dim OrderWrapper = JsonConvert.DeserializeObject(Of CLS_MergePortOrder.OrderWrapper)(JsonString)
    3. Dim Order = OrderWrapper.orders
    4. 'Alle Bestellungen durchgehen
    5. Dim Zaehler As Integer = 1
    6. Dim BestellungKontrolle As String = ""
    7. For Each item In Order
    8. 'später alle Werte unbedingt auch auf "nothing" prüfen
    9. BestellungKontrolle += vbCrLf + "Bestellung " + Zaehler.ToString + ": " + item.orderId.ToString + " " + vbCrLf + item.deliveryInfo.firstName.ToString + " " + item.deliveryInfo.lastName.ToString + vbCrLf + item.deliveryInfo.formatted.ToString + vbCrLf
    10. 'Nun die Artikel auslesen
    11. For Each art In item.items
    12. BestellungKontrolle += art.quantity.ToString + "x " + art.orderItemName.ToString + vbCrLf
    13. Next
    14. Next
    15. MsgBox(BestellungKontrolle)
    16. End Sub


    Dazu musste ich in der Klasse noch folgendes pro Array einfügen:

    VB.NET-Quellcode

    1. ​Public Class OrderWrapper
    2. Public orders() As Order
    3. End Class
    4. Public Class ArtikelWrapper
    5. Public artikel() As Item
    6. End Class
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at