VB.NET und JSON

Hi Zusammen,

nach dem Update auf IPS 3 habe ich gelesen, dass SOAP veraltet ist und stattdessen JSON verwendet werden soll.
Bisher hatte ich SOAP in Verbindung mit VB.NET.
Für SOAP hatte ich einen Webverweis in das Projekt hinzugefügt, der mir dann alle Funktionen aufgelistet hat, die ich dann verwenden konnte. Wenn ich jetzt als Webverweis „http://Mustermann:123@127.0.0.1:82“ eintrage erscheint eine Fehlermeldung „Your browser does not Support all required Features“. Das ganze ist ein Windows 8 System mit einem, meiner Meinung nach aktuellen Internet Explorer 11.
Den Fernzugriff habe ich aktiviert.

Wird die JSON Schnittstelle überhaupt über den gleich Weg angesprochen wie vorher SOAP, also als Webverweis? Oder
Wenn ja, was fehlt meinem Browser? Addon?

Gruß
Kim

JSON-RPC ist etwas völlig anderes als SOAP. SOAP hat auch als Beschreibung eine WSDL, welche du als Verweis hinzufügen kannst. Bei JSON-RPC kannst du die Funktion + Parameter meisten direkt tippen. Vermutlich musst du schauen, was für eine Bibliothek dir VB.NET dafür bietet.

paresy

Ich habe jetzt eine Möglichkeit gefunden die Befehle senden und empfangen zu können.
Was mich wundert, ich bekomme die Antwort ohne dass ich Benutzernamen und Kennwort angebe :confused:

Private IP_Symcon_Server As String = "http://127.0.0.1:82/api/"
    Private JSONRPC_Version As String = "2.0"

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        ' Create a request using a URL that can receive a post. 
        Dim request As Net.WebRequest = Net.WebRequest.Create(IP_Symcon_Server)
        ' Set the Method property of the request to POST.
        request.Method = "POST"
        ' Create POST data and convert it to a byte array.
        Dim postData As String = "{'jsonrpc': '" & JSONRPC_Version & "', 'method': 'GetValue', 'params': [13861], 'id': 1}"
        Dim byteArray As Byte() = System.Text.Encoding.UTF8.GetBytes(postData)
        ' Set the ContentType property of the WebRequest.
        request.ContentType = "application/json"
        ' Set the ContentLength property of the WebRequest.
        request.ContentLength = byteArray.Length
        ' Get the request stream.
        Dim dataStream As IO.Stream = request.GetRequestStream()
        ' Write the data to the request stream.
        dataStream.Write(byteArray, 0, byteArray.Length)
        ' Close the Stream object.
        dataStream.Close()
        ' Get the response.
        Dim response As Net.WebResponse = request.GetResponse()
        ' Display the status.
        If CType(response, Net.HttpWebResponse).StatusDescription = "OK" Then
            ' Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream()
            ' Open the stream using a StreamReader for easy access.
            Dim reader As New IO.StreamReader(dataStream)
            ' Read the content.
            Dim responseFromServer As String = reader.ReadToEnd()

            'Antwort vom Server
            Dim AntwortVomServer As String = responseFromServer
            'Beispiel:
            '{"result":88,"id":1,"jsonrpc":"2.0"}
            MessageBox.Show(AntwortVomServer)

            ' Clean up the streams.
            reader.Close()
        Else
            MessageBox.Show("Fehler")
        End If

        dataStream.Close()
        response.Close()
    End Sub

Das ist okay so.

Die Authentifizierung wird außerhalb von deinem Server (127.0.0.1:82) angefordert.
Versuche es doch einmal von einem anderen Gerät im Netzwerk.

Ich habe das komplett gelöst. Auch mit SSL. Wenn Du da noch Hilfe brauchst. Eventuell sollte ich noch mal eine „JASON RPC per VB.NET Step by Step“ schreiben.

Gesendet von meinem i9205 mit Tapatalk

@pberndro: Hast recht, übers Netzwerk wird die Authentifizierung verlangt. Allerdings erhalte ich dann eine Fehlermeldung, dass der Benutzername oder das Kennwort falsch ist.
In der Beschreibung steht, dass der Benutzername der Lizenzbenutzername ist, was in meinem Fall eine eMail-Adresse ist.

request.Credentials = New System.Net.NetworkCredential(„mustermann@web.de“, „12345“)

@Schablone: Eine Step by Step wäre echt ne Klasse Sache!

Hallo,
ich bin ebenfalls sehr interresiert an solch einer Anleitung, wär echt klasse !!

Hmmm, also ich bekomms mit der Authentifizierung zu einem anderen PC einfach nicht hin.

@Schablone: Kannst Du mir ein Beispiel schicken, wie Du es bei Dir gemacht hast?

Hast Du auch ein Passwort eingerichtet, wie in der Doku beschrieben?
Versuche zu erst um die Konsole von einem anderen Client im Netzwerk funktioniert.

Passwort ist drin und der Fernzugriff ist aktiviert.
Via PHP über die Konsole funktioniert es.

$rpc = new JSONRPC("http://mustermann@web.de:12345@192.168.2.110:82/api/");
$result = $rpc->IPS_GetKernelDir();
echo "KernelVersion: ".$result;

In .NET:


Dim request As Net.WebRequest = Net.WebRequest.Create("http://mustermann@web.de:12345@192.168.2.110:82/api/")

Erhalte ich eine Fehlmeldung: Ungültiger URI: Es wurde ein ungültiger Anschluss angegeben.

Die Emailadresse enthält ein „@“, das wird in der URL falsch interpretiert. In meiner API habe ich das nur hinbekommen, in dem ich im header die Authorization mit codiert habe. Wie das in VB geht, kann ich nicht sagen

$header=array('Authorization: Basic '. base64_encode($this->user.":".$this->password),
				  'Content-type: application/json; charset=utf-8');
	$result = file_get_contents($this->url, false, stream_context_create(
	    array('http' => array(
		'method'  => 'POST',
	        'header'  => $header,
	        'content' => $content
		)
	  )
	));

Tommi

Hallo Kim
in welcher Entwicklungsumgebung läuft dein Beispiel, unter Visual Studio 2013 mit Visual Basic bekomme ich im Stream Objekt Fehler…

Hier ist ein kleines Beispiel mit Authentifizierung.
Die Userdaten müssen korrekt kodiert werden.

http://www.hansrasmussen.com/consuming-a-json-service-with-csharp/

@pberndro : Vielen Dank, das wars. Durch hinzufügen von request.Header.Add… geht es nun. :smiley:

@juwo1811: Ja, mit VS2013



 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        ' Create a request using a URL that can receive a post. 
        Dim request As Net.WebRequest = Net.WebRequest.Create("http://192.168.2.110:82/api/")
        ' Set the Method property of the request to POST.
        request.Method = "POST"
        ' Create POST data and convert it to a byte array.
        request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes("mustermann@web.de" + ":" + "12345")))

        Dim postData As String = "{'jsonrpc': '2.0', 'method': 'GetValue', 'params': [33645], 'id': 1}"
        Dim byteArray As Byte() = System.Text.Encoding.UTF8.GetBytes(postData)
        ' Set the ContentType property of the WebRequest.
        request.ContentType = "application/json"
        ' Set the ContentLength property of the WebRequest.
        request.ContentLength = byteArray.Length
        ' Get the request stream.
        Dim dataStream As IO.Stream = request.GetRequestStream()
        ' Write the data to the request stream.
        dataStream.Write(byteArray, 0, byteArray.Length)
        ' Close the Stream object.
        dataStream.Close()
        ' Get the response.
        Dim response As Net.WebResponse = request.GetResponse()
        ' Display the status.
        If CType(response, Net.HttpWebResponse).StatusDescription = "OK" Then
            ' Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream()
            ' Open the stream using a StreamReader for easy access.
            Dim reader As New IO.StreamReader(dataStream)
            ' Read the content.
            Dim responseFromServer As String = reader.ReadToEnd()

            'Antwort vom Server
            Dim AntwortVomServer As String = responseFromServer
            'Beispiel:
            '{"result":88,"id":1,"jsonrpc":"2.0"}
            MessageBox.Show(AntwortVomServer)

            ' Clean up the streams.
            reader.Close()
        Else
            MessageBox.Show("Fehler")
        End If

        dataStream.Close()
        response.Close()
    End Sub


Um das ganze noch zu vervollständigen, anbei ein Beispiel um den Antwortstring in eine Klasse aufschlüsseln zu können.

Damit die System.Web.Script.Serialization.JavaScriptSerializer() Klasse genutzt werden kann, muss im Projekt der Verweis auf System.Web.Extensions gesetzt sein.



Public Class Form1
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        'Beispielantwort
        Dim AntwortVomServer As String = "{""result"":88,""id"":1,""jsonrpc"":""2.0""}"
        'Erstellt eine Instanz vom JavaScriptSerializer
        Dim jsSerializer As New System.Web.Script.Serialization.JavaScriptSerializer()
        'Packt den String in die Hilfsklasse
        Dim result As Hilfsklasse = jsSerializer.Deserialize(Of Hilfsklasse)(AntwortVomServer)

        MessageBox.Show("ID: " & result.id)
        MessageBox.Show("Result: " & result.result)
        MessageBox.Show("JSONRPC: " & result.jsonrpc)
    End Sub
End Class

Public Class Hilfsklasse
    Private myresult As Integer
    Public Property result() As Integer
        Get
            Return myresult
        End Get
        Set(ByVal value As Integer)
            myresult = value
        End Set
    End Property

    Private myid As Integer
    Public Property id() As Integer
        Get
            Return myid
        End Get
        Set(ByVal value As Integer)
            myid = value
        End Set
    End Property

    Private myjsonrpc As String
    Public Property jsonrpc() As String
        Get
            Return myjsonrpc
        End Get
        Set(ByVal value As String)
            myjsonrpc = value
        End Set
    End Property

End Class


Kann mir noch jemand einen Tipp geben, wie ich Variablenänderungen über JSON erkennen kann?
Hier war im Beitrag #7 beschrieben wie es unter SOAP funktioniert hat.

Hab aber keinen Plan, wie ich es jetzt mit JSON umsetzen kann.:confused:

Hallo Kim,

ich bin gerade dabei das hier zusammen zu schreiben. Gib mir noch ein bisschen Zeit.

Du brauchst dazu den Befehl „IPS_GetSnapshotChanges“ den du auch über einen Request verschickst. Ich schreibe das gerade zusammen. :wink:

Nur der Vollständigkeit halber:

Der Verweis auf die „System.Web.Extensions“ funktioniert nur wenn:

geh in die Projekteigenschaften, dort dann auf den Reiter „Kompilieren“ und dort auf den Button „Erweiterte Kompilierungsoptionen…“. In dem Dialog wählst Du dann bei „Zielframework“ .NET Framework 4.
Wenn Du ein ClientProfile Profil auswählst, bist Du auf die standardmäßig im jeweiligen Framework mitgelieferten Assemblies beschränkt. Die System.Web.Extensions.dll gehört da nicht dazu

Ansonsten super Sache!!

Besten Dank Kim! :):slight_smile: