Java paraméterátadás?
Csináltam a HttpURLConnection köré egy saját kis osztályt, ami egy sorra redukálja le az egészet, így nekem csak az URL-t meg egy-két dolgot kell beírnom, a többit elintézi az osztályt. Nem érdekes, hogy néz ki, a lényeg, hogy az osztályban van egy conn nevű változóm, ami HttpURLConnection vagy HttpsURLConnection lesz attól függően, hogy az url protokoll micsoda.
HttpURLConnection conn;
if (targetURL.getProtocol() == "http") {
________conn = (HttpURLConnection) targetURL.openConnection();
} else {
________conn = (HttpsURLConnection) targetURL.openConnection();
};
Tehát ha a protokoll http, akkor HttpURLConnection típussá lesz castolva a targetURL.openConnection által visszadott URLConnection, ha pedig a protokoll https, akkor HttpsURLConnection-é. A HttpsURLConnection ősztálya a HttpURLConnection, ezért ez így le is fordul. De futásnál hibát ír ki ("Exception in thread "main" java.lang.ClassCastException: class sun.net.www.protocol.http.HttpURLConnection cannot be cast to class javax.net.ssl.HttpsURLConnection (sun.net.www.protocol.http.HttpURLConnection and javax.net.ssl.HttpsURLConnection are in module java.base of loader 'bootstrap'").
Ilyenkor mi van? Csinálnom kell egy külön osztályt http-re és https-re is?
Igen, de mindenkinek az a problémája, hogy HttpsURLConnection-t próbál használni http kapcsolathoz, vagy épp fordítva. Én pedig azt szeretném, ha mindkét típusú kapcsolatot tudná kezelni az osztályom az átadott URL alapján.
Alighanem az lesz a megoldás, hogy csinálok egy absztrakt WebRequest osztályt, származtatok belőle egy HttpRequest és egy HttpsRequest osztályt, és ha az URL-ben http van, akkor HttpRequest osztályt példányosítok, ha pedig https, akkor HttpsRequest osztály. Vagy megcsinálhatom interface-szel is.
De biztos van ennél jobb megoldás.
Igazából megoldottam úgy, hogy a conn-t HttpURLConnection-nek deklaráltam:
HttpURLConnection conn;
Az URL függvényében döntöm el, hogy miként példányosítom:
if (targetURL.getProtocol().equals("https")) {
____conn = (HttpsURLConnection) targetURL.openConnection();
} else {
____conn = (HttpURLConnection) targetURL.openConnection();
};
Mivel a HttpURLConnection a HttpsURLConnection szülője, így ez működik. És annál az egyetlen egy hívásnál, ami csak a HttpsURLConnection osztályban létező metódust hív, castolok:
if (targetURL.getProtocol().equals("https")) {
____((HttpsURLConnection) conn).setHostnameVerifier(new HostnameVerifier() {
________public boolean verify(String s, SSLSession sslSession) {
____________return true;
____________}
____});
};
Végső soron ez egy működő megoldás, de ha véletlenül http a protokoll és valamiért ráfut a setRequestMethod metódusra, olyan hibát dob, hogy öröm nézni...
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!