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?
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.
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
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
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.
@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!
Hast Du auch ein Passwort eingerichtet, wie in der Doku beschrieben?
Versuche zu erst um die Konsole von einem anderen Client im Netzwerk funktioniert.
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
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.
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