Java-Code zu X# / Vulcan übertragbar?

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

comitas2
Posts: 48
Joined: Thu Jul 18, 2019 9:13 am
Location: Germany

Java-Code zu X# / Vulcan übertragbar?

Post 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
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Java-Code zu X# / Vulcan übertragbar?

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
comitas2
Posts: 48
Joined: Thu Jul 18, 2019 9:13 am
Location: Germany

Java-Code zu X# / Vulcan übertragbar?

Post by comitas2 »

Danke Dir Wolfgang. Ich probiere es mal ohne HttpClient.
Jörg
comitas2
Posts: 48
Joined: Thu Jul 18, 2019 9:13 am
Location: Germany

Java-Code zu X# / Vulcan übertragbar?

Post 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
comitas2
Posts: 48
Joined: Thu Jul 18, 2019 9:13 am
Location: Germany

Java-Code zu X# / Vulcan übertragbar?

Post 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
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Java-Code zu X# / Vulcan übertragbar?

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
comitas2
Posts: 48
Joined: Thu Jul 18, 2019 9:13 am
Location: Germany

Java-Code zu X# / Vulcan übertragbar?

Post 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
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Java-Code zu X# / Vulcan übertragbar?

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
comitas2
Posts: 48
Joined: Thu Jul 18, 2019 9:13 am
Location: Germany

Java-Code zu X# / Vulcan übertragbar?

Post by comitas2 »

Zur Laufzeit - als ob er zwar wollte (alle Ojekte wurden richtig initialisiert), aber nichts mit https anstellen kann...
User avatar
wriedmann
Posts: 3755
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Java-Code zu X# / Vulcan übertragbar?

Post 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
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
Post Reply