Page 1 of 1
Net Sprache
Posted: Fri Sep 16, 2022 10:00 am
by Horst
Hallo
Dank Wolfgangs Beispiel cHttpBasic konnte ich einige meiner Fehler beheben.
Da viel mir was auf
Das wird kompiliert
Code: Select all
LOCAL ohttpRequest AS System.Net.HttpWebRequest
ohttpRequest := ( System.Net.HttpWebRequest ) System.Net.HttpWebRequest:Create("https://api.bexio.com/2.0/contact")
und das nicht
Code: Select all
LOCAL ohttpRequest AS System.Net.HttpWebRequest
ohttpRequest := System.Net.HttpWebRequest:Create("https://api.bexio.com/2.0/contact")
Da frage ich mich warum.
Gruss Horst
Net Sprache
Posted: Fri Sep 16, 2022 10:51 am
by wriedmann
Hallo Horst,
der Unterschied zwischen den beiden Versionen ist ein sogenannter Cast.
Der sagt dem Compiler, daß
Code: Select all
System.Net.HttpWebRequest:Create("https://api.bexio.com/2.0/contact")
ein Objekt vom Typ
zurückliefert.
Typisiert ist diese Methode nämlich als
und in der Doku steht drin:
"A WebRequest descendant for the specific URI scheme."
Der genaue Typ der Rückgabe hängt also von der URL ab.
Wenn man das ganz sauber programmieren wollte, und eventuelle Fehler abfangen, dann könnte man das sogar so schreiben:
Code: Select all
local oTemp as System.Net.WebRequest
oTemp := System.Net.HttpWebRequest:Create("https://api.bexio.com/2.0/contact")
if oTemp is System.Net.HttpWebRequest
ohttpRequest := ( System.Net.HttpWebRequest ) oTemp
else
// Fehlerbehandlung
endif
Wolfgang
Net Sprache
Posted: Fri Sep 16, 2022 12:25 pm
by robert
Wolfgang,
wriedmann post=23883 userid=336 wrote:Hallo Horst,
Wenn man das ganz sauber programmieren wollte, und eventuelle Fehler abfangen, dann könnte man das sogar so schreiben:
Code: Select all
local oTemp as System.Net.WebRequest
oTemp := System.Net.HttpWebRequest:Create("https://api.bexio.com/2.0/contact")
if oTemp is System.Net.HttpWebRequest
ohttpRequest := ( System.Net.HttpWebRequest ) oTemp
else
// Fehlerbehandlung
endif
I would code it like this
Code: Select all
if oTemp is System.Net.HttpWebRequest VAR ohttpRequest
// do your thing
else
// Fehlerbehandlung
endif
The advantages:
- there is no need for a separate declaration of ohttpRequest
- the scope (life time ) of the variable is that of the IF statement
Robert
Net Sprache
Posted: Fri Sep 16, 2022 2:11 pm
by wriedmann
Hi Robert,
thank you very much for your comment.
Personally I prefer to not use the "var" statement, but to define a variable explicetely in the header of the method, first to keep my code more readable (many years to come), and second to help XIDE with Intellisense.
But that is a pure personal choice and I'm pretty sure many other programmers would not agree with me on this.
Wolfgang
Net Sprache
Posted: Fri Sep 16, 2022 3:10 pm
by Horst
Hallo
Das heisst der Compiler versucht links und rechts der Zuweisung den gleichen Datentyp zu erhalten.
Er weiss also, dass ohttpRequest ein Objekt ist vom Typ System.Net.HttpWebRequest weil ich es im LOCAL definiert habe.
Laut Hilfe gibt Create() einen WebRequest zurück , hmmm ein WebRequest ist kein HttpWebRequest darum muss man tricksen und ( System.Net.HttpWebRequest ) vorne ran schreiben . Richtig ?
httpWebRequest erbt von WebRequest, da verhält sich .Net anders als VO oder ? VO würde da nicht reklamieren.
Noch eine Frage. Wen ich den API Request von einer http Seite auf eine https Seite mache geht das ? Ich bekomme da die Fehlermeldung:
Es konnte kein geschützter SSL/TLS-Kanal erstellt werden..
Gruss
Horst
Net Sprache
Posted: Fri Sep 16, 2022 3:50 pm
by wriedmann
Hallo Horst,
nicht ganz: Du könntest einen Objekt, das als WebRequest definiert ist, ohne weiteres ein Objekt der Klasse HttpWebRequest zuweisen, aber nicht umgekehrt.
Das geht in VO aber auch nicht, wenn die Methode/Funktion streng typisiert ist und der Rückgabewert nicht vom Typ "object" ist.
Das mit dem Casten sagt dem Compiler nur: hör mal, das, was hier der Rückgabewert ist, ist ein Objekt der Klasse HttpWebRequest.
Damit ist der Compiler zufrieden.
Wenn zur Laufzeit das Objekt aber nicht den Typ hat, auf den gecastet wird, sondern einen inkompatiblen Typ, bekommst Du einen Laufzeitfehler.
Was die Fehlermeldung betrifft: Wie Deine Seite aufgerufen wird, ist vollkommen gleichgültig - es ist Dein Prozeß, der die Verbindung aufbaut. Und wenn das Zertifikat der aufgerufenen Seite korrekt ist, sollte das funktionieren - außer die aufgerufene Seite verlangt mindestens TLS 1.2.
Dann musst Du vor dem ersten Aufruf TLS 1.2 einschalten:
Code: Select all
System.Net.ServicePointManager.SecurityProtocol := System.Net.SecurityProtocolType.Tls12
Wolfgang
Net Sprache
Posted: Fri Sep 16, 2022 4:04 pm
by Horst
Hallo Wolfgang
Ich könnte dich knuddeln.
Code: Select all
System.Net.ServicePointManager.SecurityProtocol := System.Net.SecurityProtocolType.Tls12
und es funktionierte
Danke
Horst