Rest API Newsletter2Go

  • VB.NET
  • .NET (FX) 4.0

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Holistiker.

    Rest API Newsletter2Go

    Hallo Zusammen,

    ich habe bereits lange im Internet gesucht aber irgendwie scheine ich da nichts passendes zu finden, deshalb hoffe ich hier auf Antwort von den VB-Profis ;)

    Folgendes:

    Ich Programmiere gerade in VB eine Rest-API Schnittstelle zur bekannten Seite "newsletter2go". Die Newsletter2Go API benutzt die Rest API, welche ja die meisten vermutlich kennen.
    Für die Umsetzung benutze ich daher die RestSharp Dll.
    Newsletter2Go fordert eine Authentifizierung mittels Token welchen man sich über einen Authorization "POST" holen kann... Das klappt auch alles wunderbar :)

    Nun bin ich an der stelle wo ich eine sogenannte Transaktionsmail versenden möchte. Heißt: auf der Seite von Newsletter2go wird ein Template erstellt, welches dann auch Variablen enthält und dieses Template wird über die Schnittstelle mit Daten gefüttert und an die zuvor eingegebenen Email adressen gesendet. An dieser stelle geht es um eine Versandbestätigung die wir versenden möchten.

    Leider scheitert es hier an der übergabe der Parameter an die Schnittstelle.

    Die offizielle Beschreibung (docs.newsletter2go.com/)( unter "Newsletter" Post/Send) die ich nach Rücksprache vom Newsletter2go Support erhalten habe lautet:

    Über die API nutzen sie folgenden Endpunkt:

    POST api.newsletter2go.com/newsletters/<newsletterId>/send

    Über den Parameter contexts können sie ein Array mit Empfängern und deren Platzhalter Daten übergeben:

    Wenn der Platzhalter also Wert1 heißt {{ recipient.Wert1 }}, dann muss folgendes übergeben werden:

    {"contexts":[{"recipient":{"email":"empfanger1@mail.com","Wert1":"zu_übergebener_wert"}}, {"recipient":{"email":"empfanger2@mail.com","Wert1":"zu_übergebener_wert"}} ]}



    Mit Platzhaltern sind hier die Variablen gemeint die man an die Vorlage übergeben kann.

    Problem aktuell ist, dass ich keine Ahnung habe wie ich, dass was der Herr mir geschrieben hat nun umsetzen muss.

    Hier mal mein aktueller Code:

    VB.NET-Quellcode

    1. Public Function sendeversandbestaetigung(ByRef token As String, ByRef werte As String)
    2. mailingid = "rdpn1zrr"
    3. Dim client1 As New RestClient("https://api.newsletter2go.com/")
    4. Dim request = New RestRequest("newsletters/" & mailingid & "/send", Method.POST)
    5. request.AddHeader("Accept", "application/json")
    6. request.AddHeader("Content-Type", "application/x-www-form-urlencoded")
    7. request.AddHeader("Authorization", "Bearer " + token)
    8. request.AddParameter("contexts", werte)
    9. Dim response2 As IRestResponse = client1.Execute(request)
    10. Dim json As JObject = JObject.Parse(response2.Content)
    11. Return response2.Content
    12. End Function


    Am Ende muss halt (zumindest würde ich das mal irgendwie behaupten) in der Variable "Werte" die Parameter übergeben werden, die mir der Support mitgeteilt hat aber wie mache ich das am besten?

    Egal was ich aktuell schon alles versucht habe ich bekomme immer die Meldung von Schnittstelle zurück geliefert: Bad Request (for a transaction-mailing you need to submit contexts with an emial in every context submittet)

    Ich hänge da jetzt schon seit Tagen dran und ich würde mich wirklich freuen, wenn mir jemand von euch helfen könnte.

    Danke,Danke,Danke!!!
    Ich vermute mal so.

    Erstell dir für context und recipient eine Klasse (genannt POCO) mit den entsprechenden Properties.

    C#-Quellcode

    1. public class Recipient
    2. {
    3. public string email { get; set; }
    4. public string Wert1 { get; set; }
    5. }
    6. public class Context
    7. {
    8. public List<Recipient> recipients { get; set; }
    9. }



    Erstell ein neues Context Objekt und fülle die List of Recipients mit allen Empfängern.
    Dann serialisierst du das (zB mit Newtonsoft aus NuGet )

    VB.NET-Quellcode

    1. Dim context as New context
    2. '.. befülle mit allem
    3. dim jsonContext as string
    4. jsonContext = JsonConvert.SerializeObject(context)
    5. request .AddParameter("application/json; charset=utf-8", jsonContext , ParameterType.RequestBody)
    6. Dim response2 As IRestResponse = client1.Execute(request)


    So in etwa. Habe es nicht getestet. Aber denke ca so sollte es gehen.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Okay schonmal danke dafür. Jetzt bin ich schonmal nen schritt weiter und ich bekomme "nurnoch" die Meldung: The 1. context does not have an email-address.

    Das liegt vermutlich daran, dass im String der "schlüsselbegriff" recipient fehlt:

    Der String sieht aktuell so aus:

    {"contexts":[{"mail":test@test.de","Auftragsnummer":"21051632"}]}


    Mein Code jetzt so:

    Die Klasse:

    VB.NET-Quellcode

    1. Public Class poco
    2. Public Class Recipient
    3. Public email As String
    4. Public Auftragsnummer As String
    5. End Class
    6. Public Class context
    7. Public contexts As New List(Of Recipient)
    8. End Class
    9. End Class



    Der Aufruf:

    VB.NET-Quellcode

    1. Dim con As New poco.context()
    2. Dim empf As New poco.Recipient()
    3. empf.Auftragsnummer = "21051632"
    4. empf.email = "test@test.de"
    5. con.contexts.Add(empf)
    6. Dim jsoncontext As String
    7. jsoncontext = Newtonsoft.Json.JsonConvert.SerializeObject(con)
    8. MsgBox(jsoncontext)
    9. mailingid = "rdpn1zrr"
    10. Dim client1 As New RestClient("https://api.newsletter2go.com/")
    11. Dim request = New RestRequest("newsletters/" & mailingid & "/send", Method.POST)
    12. request.AddHeader("Accept", "application/json")
    13. request.AddHeader("Content-Type", "application/x-www-form-urlencoded")
    14. request.AddHeader("Authorization", "Bearer " + token)
    15. request.AddParameter("application/json; charset=utf-8", jsoncontext, ParameterType.RequestBody)
    16. Dim response2 As IRestResponse = client1.Execute(request)
    Also die List of Recipients muss recipient heißen.
    Was du brauchst is noch ein Root Objekt mit contents.

    Ich weiß nicht ob es je mehr contents gibt. Also entweder

    VB.NET-Quellcode

    1. Public Class Root
    2. Public contexts As New List(Of contexts )
    3. End Class
    4. Oder
    5. Public Class Root
    6. Public contexts as Context
    7. End Class
    8. 'Und dann logischerweise
    9. dim r as new Root
    10. 'dein context zeugs erstellen
    11. r.contexts = c
    12. Newtonsoft.Json.JsonConvert.SerializeObject(r)


    LG

    //EDIT
    Das genannt POCO bezieht sich übrigens einfach generell auf die Bezeichnung derartiger Klassen. Es steht für en.wikipedia.org/wiki/Plain_old_CLR_object
    So nennt man einfache Datenklasse ohne Vererbung die minimalistisch gehalten sind. In dem Fall könnte man sie auch DataTransferObjects nennen (dto) da wirklich null Methoden oder Funktionen benötigt werden.
    Es sind einfache Datenklasse welche nur dem Transport von Daten dienen.
    Das ist meine Signatur und sie wird wunderbar sein!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mono“ ()

    Ich habe leider doch noch eine frage :(

    Wie bekomme ich denn bitte so eine Auflistung hin?

    Also wo als Variablennamen quasi Zahlen stehen!? :( Mit den Variablennamen in den Klassen war das ja echt easy aber ich kann ja keine Nummern als Variablen anlegen:


    PHP-Quellcode

    1. associations:{0: "Kundennummer", 1: "email", 2: "", 3: "", 4: "", 5: "", 6: ""}


    Danke!!
    Hallo

    Indem du JsonNet sagst mit welchem Namen er es serialisieren soll.

    VB.NET-Quellcode

    1. Public Class Foo
    2. <JsonProperty(PropertyName = "1")>
    3. Public Property FooProperty as String
    4. End Class


    Ist jetzt aus dem Kopf, sollte aber so gehen.

    Edit: Achso, soll das eine List(Of String) ?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Leider funktioniert das nicht.

    Wenn ich:

    VB.NET-Quellcode

    1. Public associations As New Dictionary(Of Integer, String)


    Und dann:

    VB.NET-Quellcode

    1. con334.associations.Add(0, "Kundennummer")
    2. con334.associations.Add(1, "E-Mail")


    sieht das zwar schön aus aber die Auflistung selber also 0,1,2 ist in Anführungsstriche gesetzt. Also:

    PHP-Quellcode

    1. {"0": "Kundennummer", "1": "E-Mail"}


    Der Ansatz mit der Json Property scheint sich in mein Project nicht so ohne weiteres einbauen zu lassen. Zumindest wüste ich nicht wie ich das als Array ( Associations ist ein array ) in der Klasse darstellen soll.
    @Holistiker Mir scheint, dass Dein JSon-File falsch aufgebaut ist.
    Bei mir sieht das so aus:

    Quellcode

    1. {
    2. "Type": "ReadAdVoltage",
    3. "Input":
    4. {
    5. "Channel" : 1,
    6. "NbOfSamples" : 64,
    7. "MinimumValue" : 0,
    8. "MaximumValue" : 1,
    9. "Conversion" : 1000,
    10. "Unit" : "mA"
    11. }
    12. },
    Du hast immer zuerst den Property-Name, dann denn Wert.
    Der Name ist ein String, der Wert kann dann numerisch sein.
    Dein JSon-Code müsste dann so aussehen:

    Quellcode

    1. {
    2. "Kundennummer" : 0,
    3. "E-Mail" : 1
    4. }

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Holistiker schrieb:

    Wieso ist das Falsch?

    Holistiker schrieb:

    sieht das zwar schön aus aber die Auflistung selber also 0,1,2 ist in Anführungsstriche gesetzt.
    Weil der erste Teil ist der Name, der zweite Teil ist der Wert.
    Namen sind Strings, Werte können numerisch sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kein Valides Json Format würde mich halt schwer wundern weil, wenn man auf der Homepage selber quasi den manuellen Weg geht und dort den Datei Upload startet, kann man sich mit F12 ja quasi im Entwickermodus die
    Requestformate, den Header etc. anschauen und dort steht der Code halt auch direkt so :

    PHP-Quellcode

    1. {file: "t1wmxgc7", associations: {0: "Kundennummer", 1: "email", 2: "", 3: "", 4: "", 5: "", 6: ""},}
    2. associations:{0: "Kundennummer", 1: "email", 2: "", 3: "", 4: "", 5: "", 6: ""}
    3. emptyBeforeImport:true
    4. file:"t1wmxgc7"
    5. groupId:"wg6wg6v7"
    6. insertIntoFormLists:false


    Deshalb wundert mich wie das kein valides Json sein kann?

    Nur damit das klar ist. Hier wird quasi eine ExcelTabelle bzw. CSV. Datei hochgeladen und mit der Angabe 0,1,2 wird quasi angegeben was in der CSV Datei in Spalte 0,1,2 etc. steht.

    Also Spalte 0 = Kundennummer
    Spalte1=E-mail usw.

    //Edit habe gerade auch den Weg über die JsonProperty versucht. Da werden die "Zahlen" auch in "" gesetzt *grml*

    //Edit2 Oh man sorry Leute das hat die ganze Zeit funktioniert (Beide Arten). Ich habe einfach nur die falschen Daten eingetragen. Habe anstelle der Plazhalterbezeichnung auf der Homepage immer den Namen von der Spalte in der CSV eingegeben. *Vor den Kopf hau*

    Danke an alle!!!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Holistiker“ ()