Page 1 of 3
Java-Code zu X# / Vulcan übertragbar?
Posted: Tue Nov 23, 2021 10:15 am
by comitas2
Hallo,
ich möchte eine einfache Http-Kommunikation realisieren. Dazu wird folgender Java-Code vorgegeben:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url))
.setHeader("Authorization", createAuthHeader(uName, password))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("nRESPONSEn------------------------n"+response.body() +"n");
System.out.println("STATUS CODEn------------------------n"+response.statusCode());
Habe es schon mit der Klasse HttpClient aus #using System.Net.Http versucht, komme aber nicht weiter.
Hat jemand einen Vorschlag?
Gruß Jörg
Java-Code zu X# / Vulcan übertragbar?
Posted: Tue Nov 23, 2021 10:35 am
by wriedmann
Hallo Jörg,
das hier funktioniert bei mir:
Code: Select all
method GetResult( cURL as string ) as byte[]
local aResult as byte[]
local oRequest as System.Net.WebRequest
local oCredentials as System.Net.NetworkCredential
local oStream as Stream
local oResponse as System.Net.WebResponse
aResult := byte[]{ 0 }
oRequest := System.Net.WebRequest.Create( cURL )
if ! String.IsNullOrEmpty( _cUserName )
oCredentials := System.Net.NetworkCredential{ _cUserName, _cPassword }
oRequest:Credentials := oCredentials
oRequest:PreAuthenticate := true
endif
oResponse := oRequest:GetResponse()
_cHttpStatus := ( ( System.Net.HttpWebResponse ) oResponse ):StatusDescription
oStream := oResponse:GetResponseStream()
aResult := self:GetBytes( oStream )
oStream:Close()
oResponse:Close()
return aResult
Code: Select all
private method GetBytes( oStream as System.IO.Stream ) as byte[]
local aResult as byte[]
local aBuffer as byte[]
local aChunk as byte[]
local oReader as BinaryReader
local nChunkSize as int
aResult := byte[]{ 0 }
oReader := System.IO.BinaryReader{ oStream }
nChunkSize := 1024
aChunk := oReader:ReadBytes( nChunkSize )
while aChunk:Length > 0
aBuffer := byte[]{ aResult:Length + aChunk:Length }
Array.Copy( aResult, 0, aBuffer, 0, aResult:Length )
Array.Copy( aChunk, 0, aBuffer, aResult:Length, aChunk:Length )
aResult := aBuffer
aChunk := oReader:ReadBytes( nChunkSize )
end
oReader:Close()
return aResult
Wolfgang
Java-Code zu X# / Vulcan übertragbar?
Posted: Tue Nov 23, 2021 10:39 am
by comitas2
Danke Dir Wolfgang. Ich probiere es mal ohne HttpClient.
Jörg
Java-Code zu X# / Vulcan übertragbar?
Posted: Mon Nov 29, 2021 11:20 am
by comitas2
Hallo,
der Code vom Wolfgang funktioniert für einfache Anmeldung. Aber für die Basic Authentifizierung (entsprechender Base64 String wurde erzeugt) bekomme ich immer nur die Meldung:
"Von der Übertragungsverbindung können keine Daten gelesen werden: Eine vorhandene Verbindung wurde vom Remotehost geschlossen."
Während der Code von einer Internet-Beispielseite, der in einer c#-Konsolen-Anwendung (.NET Core 3.1) bei mir sofort läuft (url, user+pw sind Beispiele):
Code: Select all
var url = "https://connect.firma.com/simulator/v1";
var httpRequest = (HttpWebRequest)WebRequest.Create(url);
httpRequest.Accept = "application/xml";
httpRequest.Headers["Authorization"] = "Basic VGVzdDpQYXNzd29yZA==";
var httpResponse = (HttpWebResponse)httpRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}
Console.WriteLine(httpResponse.StatusCode);
Gibt es Vorschläge und Hinweise, wie diese Basic Authentifizierung auch unter Vulcan/X# (eingest. Framework 4.0) zum Laufen gebracht werden kann?
Gruß Jörg
Java-Code zu X# / Vulcan übertragbar?
Posted: Mon Nov 29, 2021 1:04 pm
by comitas2
Hier wäre Wolfgang sein Code von mir erweitert (lauffähig unter Vulcan/X#):
Code: Select all
LOCAL cUrl, _cUserName, _cPassword, _cHttpStatus, cResult, cAuthHeader AS STRING
LOCAL aResult AS BYTE[]
LOCAL oRequest AS System.Net.HttpWebRequest
LOCAL oStream AS Stream
LOCAL oResponse AS System.Net.HttpWebResponse
cUrl := "https://connect.firma.com/simulator/v1"
_cUserName := "Test"
_cPassword := "Password"
aResult := BYTE[]{ 0 }
TRY
oRequest := ( System.Net.HttpWebRequest ) System.Net.WebRequest.Create( cUrl )
oRequest:Accept := "application/xml"
oRequest:Headers["Authorization"] := "Basic VGVzdDpQYXNzd29yZA=="
oRequest:PreAuthenticate := TRUE
oResponse := ( System.Net.HttpWebResponse )oRequest:GetResponse()
_cHttpStatus := ( ( System.Net.HttpWebResponse ) oResponse ):StatusDescription
oStream := oResponse:GetResponseStream()
aResult := self:GetBytes( oStream )
oStream:Close()
oResponse:Close()
CATCH e AS WebException
ErrorBox{ NIL, e:Message }:Show() //"Von der Übertragungsverbindung können keine Daten gelesen werden: Eine vorhandene Verbindung wurde vom Remotehost geschlossen."
END TRY
RETURN aResult
Ich habe bereits alle möglichen Codeschnipsel aus dem Internet zu diesem Thema mit ausprobiert.
Jedoch ist immer bei oRequest:GetResponse() Schluß!
Kann es eventuell sein, dass das eingestellte .NET Framwork 4.0 nicht die Basic Authorization kann?
Gibt es vielleicht Jemanden, bei dem die Basic Authorisation unter Vulcan/X# läuft?
Gruß Jörg
Java-Code zu X# / Vulcan übertragbar?
Posted: Mon Nov 29, 2021 1:10 pm
by wriedmann
Hallo Jörg,
mal nur nach X# umgesetzt:
Code: Select all
var url := "https://connect.firma.com/simulator/v1"
var httpRequest := (HttpWebRequest)WebRequest.Create(url)
httpRequest:Accept := "application/xml"
httpRequest:Headers["Authorization"] := "Basic VGVzdDpQYXNzd29yZA=="
var httpResponse := (HttpWebResponse)httpRequest:GetResponse()
begin using (var streamReader := StreamReader{ httpResponse:GetResponseStream()})
var result := streamReader:ReadToEnd()
end using
Console.WriteLine(httpResponse:StatusCode)
Ich habe da nur die Syntax umgeschrieben, aber nicht getestet.
Wolfgang
Java-Code zu X# / Vulcan übertragbar?
Posted: Mon Nov 29, 2021 1:20 pm
by comitas2
Danke Dir Wolfgang. Das Prinzip der Befehlsreihenfolge ist -denke ich- klar.
Und dennoch ist bei oRequest:GetResponse() immer Schluß.
Also muß das Problem tiefer liegen!? Die einzelnen Elemente vom Object oRequest unterscheidet sich
an einigen Stellen von dem des funtionierenden Objectes oRequest in der lauffähigen C# Variante...
Gruß Jörg
Java-Code zu X# / Vulcan übertragbar?
Posted: Mon Nov 29, 2021 1:24 pm
by wriedmann
Hallo Jörg,
dann dürfte das Problem darin liegen, dass Microsoft den Code für .NET Core umgebaut hat.
Und dann dürfte auch der C#-Code mit .NET 4.x nicht funktionieren.
Gibt es das Problem beim Kompilieren oder zur Laufzeit?
Wolfgang
Java-Code zu X# / Vulcan übertragbar?
Posted: Mon Nov 29, 2021 1:29 pm
by comitas2
Zur Laufzeit - als ob er zwar wollte (alle Ojekte wurden richtig initialisiert), aber nichts mit https anstellen kann...
Java-Code zu X# / Vulcan übertragbar?
Posted: Mon Nov 29, 2021 1:56 pm
by wriedmann
Hallo Jörg,
also dieser Code funktioniert bei mir:
Code: Select all
method GetResponse( cURL as string ) as string
local oRequest as WebRequest
local oResponse as System.Net.WebResponse
local oStream as Stream
local oStreamReader as StreamReader
local cResult as string
cResult := ""
oRequest := WebRequest.Create( cURL )
oRequest:@@Method := "GET"
oRequest:ContentType := "application/json"
if ! String.IsNullOrEmpty( ProgSettings.AccessToken )
oRequest:Headers:Add( "Authorization", "bearer " + ProgSettings.AccessToken )
endif
oResponse := oRequest:GetResponse()
oStream := oResponse:GetResponseStream()
oStreamReader := StreamReader{ oStream }
cResult := oStreamReader:ReadToEnd()
oStream:Close()
oResponse:Close()
return cResult
Habe ich aus einem laufenden Projekt rauskopiert.
Wolfgang