Amazon SP API - Feed hochladen

  • VB.NET
  • .NET 5–6

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Superuse.

    Amazon SP API - Feed hochladen

    Hallo,

    kennt sich jemand mit der Amazon SP-API aus? Im März nächsten Jahres nicht Amazon nur noch JSON-Dateien im Upload an. d.h. ich muß meine bisherige csv/xml-Daten auf JSON umstellen. Leider kann ich dazu die bisher genutzte API (github.com/abuzuhri/Amazon-SP-…ampleCode/OrdersSample.cs) nicht mehr nutzen, da es dort bislang keine Funktion zum Upload gibt.
    Ich habe mir mit Hilfe von CoPilot nun einen großen Teil der neuen Anbindung zusammengestellt. Ich kann mich damit zumind. erfolgreich bei Amazon authentifizieren und bekomme auch als Antwort die dazu notwendige Upload URL.

    Ich bekomme dort etwas, das so aussieht:
    : {"feedDocumentId":"amzn1.tortuga.4.eu.04a23f8b-1531-4434-9273-b72bd0947dcb.T1FB0CERNW7JJM","url":"https://tortuga-prod-eu.s3-eu-west-1.amazonaws.com/04a23f8b-1531-4434-9273-b72bd0947dcb.amzn1.tortuga.4.eu.T1FB0CERNW7JJM?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20241203T155150Z&X-Amz-SignedHeaders=content-type%3Bhost&X-Amz-Expires=300&X-Amz-Credential=AKIAXXXXXXXX53%2F20241203%2Feu-west-1%2Fs3%2Faws4_request&X-Amz-Signature=a18a2217fb996e8e67a8553f940887be0ab1c782c062f19c5725dc4f7ebc4c34"}

    Soviel ich die furchtbare Doku verstanden hab, muß ich nun mittels Put an diese URL meine JSON-Daten hochladen. Dazu habe ich folgende Funktion:

    VB.NET-Quellcode

    1. Public Async Function UploadJsonToAmazonAsync(signedUrl As String, jsonData As String) As Task
    2. Try
    3. ' Debugging: URL und Body loggen
    4. RichTextBox1.AppendText("Signed URL: " & signedUrl & vbCrLf)
    5. RichTextBox1.AppendText("JSON Body: " & jsonData & vbCrLf)
    6. ' HttpClient für die Anfrage erstellen
    7. Using client As New HttpClient()
    8. ' Content-Type setzen
    9. Dim content As New StringContent(jsonData, Encoding.UTF8, "application/json")
    10. ' Payload-Hash berechnen
    11. Dim payloadHash = BitConverter.ToString(SHA256.Create().ComputeHash(Encoding.UTF8.GetBytes(jsonData))).Replace("-", "").ToLower()
    12. ' client.DefaultRequestHeaders.Add("x-amz-content-sha256", payloadHash)
    13. ' Protokollierung der Anfrage
    14. RichTextBox1.AppendText("Request Headers:" & vbCrLf)
    15. For Each header In client.DefaultRequestHeaders
    16. RichTextBox1.AppendText(header.Key & ": " & String.Join(", ", header.Value) & vbCrLf)
    17. Next
    18. ' PUT-Anfrage an die signierte URL senden
    19. Dim response As HttpResponseMessage = Await client.PutAsync(signedUrl, content)
    20. ' Erfolgreiche Antwort prüfen
    21. If response.IsSuccessStatusCode Then
    22. RichTextBox1.AppendText("Feed-Daten erfolgreich hochgeladen." & vbCrLf)
    23. Else
    24. ' Fehler protokollieren
    25. Dim errorDetails As String = Await response.Content.ReadAsStringAsync()
    26. RichTextBox1.AppendText("Fehler beim Hochladen der Daten: " & response.StatusCode & vbCrLf)
    27. RichTextBox1.AppendText("Details: " & errorDetails & vbCrLf)
    28. End If
    29. End Using
    30. Catch ex As Exception
    31. ' Fehlerbehandlung
    32. RichTextBox1.AppendText("Fehler: " & ex.Message & vbCrLf)
    33. End Try
    34. End Function


    Als Fehler bekomme ich da aber immer:
    Fehler beim Hochladen der Daten: 403
    Details: <?xml version="1.0" encoding="UTF-8"?>
    <Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>

    Was ich nicht verstehe, da die zurückgegebenen Upload-URL meines wissens bereits die Signatur von Amazon enthält.

    Kann mir hier jemand (gerne auch gegen Bezahlung) helfen?
    Nimm ByteArrayContent, anstatt StringContent. Bietet auch noch nützliche Erweiterungsmethoden für JSON. In der Feed-API-Doku findest du auch Beispiele in Java, da kannst du auch immer nachschauen.
    learn.microsoft.com/de-de/dotn…arraycontent?view=net-8.0
    developer-docs.amazon.com/sp-a…2021-06-30-use-case-guide
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Hab nun diese 3 Zeilen ausgetauscht/hinzugefügt

    VB.NET-Quellcode

    1. Dim byteArray = Encoding.UTF8.GetBytes(jsonData)
    2. Dim content As New ByteArrayContent(byteArray)
    3. ' Content-Type setzen
    4. content.Headers.ContentType = New System.Net.Http.Headers.MediaTypeHeaderValue("application/json")


    Macht aber keinen Unterschied. Bringt den gleichen Fehler.