POST Request an NitrAPI

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

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Moritz30.

    POST Request an NitrAPI

    Hey,
    ich möchte mit meiner Anwendung einen POST Request an die NitrAPI (Nitrado API).
    Über CURL funktioniert das auch alles, leider nicht mit meiner App.

    Seit wochen versuche ich dieses Problem zu lösen und bin inzwischen so verzweifelt, dass ich Code von StackOverflow und Co. verwende,
    nur leider bekomme ich bei allen den selben Fehler: "Access violation". Mitlerweile bin ich so weit, dass ich diesen Fehler nicht mehr erhalte.

    Hier mein aktueller Code:

    VB.NET-Quellcode

    1. Public Function postRequest(ByVal uri As String, ByVal data As String) As Object
    2. Dim postData As Byte() = System.Text.Encoding.UTF8.GetBytes(data)
    3. Dim request As WebRequest = WebRequest.Create(Me.apiBaseUri & uri & "?access_token=" & Me.access_token)
    4. MsgBox(Me.apiBaseUri & uri & "?access_token=" & Me.access_token) 'Zur Kontrolle, dass die URL korrekt ist. Ist sie.
    5. request.Method = "POST"
    6. Dim dataStream As Stream = request.GetRequestStream
    7. dataStream.Write(postData, 0, postData.Length)
    8. dataStream.Close()
    9. Return request.GetResponse()
    10. End Function

    Sobald die Anwendung in irgend einer Weise die Antwort vom Request (request.GetResponse, Zeile 14) abfragt, stürzt das Programm ab.
    Ich bekomme keinen Output. Den einzigen Fehler den ich erhalte, ist folgender: A first chance exception of type 'System.Net.WebException' occurred in System.dll
    Das ist alles an Information, was ich bekomme. Ich habe nichts bei Google gefunden, was mich weiter bringt.

    Viele Grüße,
    Sonderzeichen
    ...aber gut, dass wir darüber gesprochen haben!
    @shaebich
    Oh sorry. Ich war schon so angenervt, dass ich daran gar nicht mehr gedacht habe ;)

    Beispieldaten sind "password=Test", wie hier nachzulesen:
    nitrado.github.io/Nitrapi/reso…l/#gameserversftppassword

    Zum authentifizieren wird kein Header benötigt.
    Diese erfolgt indem ein zuvor generierter Access-Token mit ?access_token=<Token> an die URL angehängt wird.
    Eine Authentifizierung über einen Header funktioniert hier nicht.

    Was zurück kommt, kann ich nicht sagen, da das Programm abstürzt wenn ich darauf via request.GetResponse zugreife.
    Was ich jedoch sagen kann, ist dass es via CURL (Getestet auf Debian 7) einwandfrei funktioniert. An der API liegt es also nicht.

    Viele Grüße,
    Sonderzeichen
    ...aber gut, dass wir darüber gesprochen haben!

    Sonderzeichen schrieb:

    iese erfolgt indem ein zuvor generierter Access-Token mit ?access_token=<Token> an die URL angehängt wird.
    Eine Authentifizierung über einen Header funktioniert hier nicht.


    Ich nehme an der Access Token besteht aus: Base64(Username + Passwort) ?? oder woher bekommst du den Access Token?
    @shaebich
    Warum ist das wichtig? Es geht nur darum einen POST Request korrekt zu versenden.
    Den Access-Token bekomme ich über meine Anwendung nach einem Login welcher über die OAuth API von Nitrado erfolgt:
    projects.sidcode.de/nitrapi

    Die OAuth Dokumentation ist hier zu finden:
    nitrado.github.io/Nitrapi/oauth/

    Viele Grüße,
    Sidcode
    ...aber gut, dass wir darüber gesprochen haben!
    wichtig, weil ichs gern testen würde aber keine Lust habe mich einmal quer durch die API zu lesen...

    hier hab ne alte funktion ausgegraben mit der ich früher mal nen request gemacht hab.

    VB.NET-Quellcode

    1. Public Overridable Async Function GetResponseAsync(ByVal url As String) As Task(Of String)
    2. request = CType(HttpWebRequest.Create(url), HttpWebRequest)
    3. 'falls du nen Header hast
    4. 'request.Headers.Add("X-Requested-With", "XMLHttpRequest")
    5. Dim cookieCon As New CookieContainer
    6. request.CookieContainer = cookieCon
    7. response = CType(request.GetResponse(), HttpWebResponse)
    8. Dim returnStr As String
    9. Using reader As New StreamReader(response.GetResponseStream)
    10. returnStr = Await reader.ReadToEndAsync()
    11. End Using
    12. Return returnStr
    13. End Function


    Damit kamen eig. alle JSON requests zurück.
    Geht auch eleganter mit nem WebClient...aber weil mir das mit access Token etc. jetzt zu stressig ist kannst du obiges probieren.
    @shaebich
    vielen Dank.
    Jedoch finde ich in dem Code keine Möglichkeit Daten zu versenden.
    Ich möchte ja mit einem Post-Request Daten an die API senden.

    Der Access-Token wird nur an die URL mit angehängt, die ich anfrage.
    Das sieht dann z.B. so aus: api.nitrado.net/services/<id>?access_token=MeinToken

    Viele Grüße,
    Sonderzeichen
    ...aber gut, dass wir darüber gesprochen haben!

    Sonderzeichen schrieb:

    Jedoch finde ich in dem Code keine Möglichkeit Daten zu versenden.
    Ich möchte ja mit einem Post-Request Daten an die API senden.


    Klar versendest du damit einen Post Request...

    VB.NET-Quellcode

    1. Dim result As String = Await GetResponseAsync("api.nitrado.net/services/<id>?access_token=...")


    Das Result sollte der JSON String sein der die API dir zurück.
    @shaebich
    Oh, ich wusste bis dato gar nicht, dass ich die Daten auch direkt wie bei einem GET-Request anhängen kann.
    Via cURL hab ich das immer so gemacht:
    curl --request POST 'URL?access_token=tralalala' --data "data=Value&data2=SecondValue"
    Somit dachte ich auch immer, dass ich die Daten in VB.NET auch extra angeben muss, so wie hier z.B.über --data "Data".

    Wieder was gelernt ;)

    Vielen Dank!
    ...aber gut, dass wir darüber gesprochen haben!