Oggie85 Geschrieben 14. Oktober 2010 Geschrieben 14. Oktober 2010 Hallo Forum, ich habe unter MS Excel eine VBA Anwendung geschrieben die in der Lage ist automatisiert eine Datei zu laden. Für den, den es interessiert: Ich will mit dem Programm automatisiert einen Abgleich zwischen zwei webbasierten Anwendungen durchführen. Gedacht ist das ich mit mittels eines Commandlinetools den Inhalt eines bestimmten Feldes hole in dem die URL der Datei aus Anwendung 2 steht. Dann Lade ich mir die Datei Auf die HDD und lade es mit der CLI an die korrekte Position in Anwendung 1. Hier der Codeschnipsel aus VBA für den Download Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP") Dim Buffer() As Byte Dim Buffer2 As String With objXMLHTTP .Open "GET", strDateiadresse, True, strUserName, strPassword .send 'Wait for request to finish Do While objXMLHTTP.readyState <> 4 DoEvents Loop Buffer = .responseBody Buffer2 = .getAllResponseHeaders() End With Wie zu sehen wird mittels eines xmlhttp_get die URL zusammen mit dem Benutzernamen und dem Passwort an den Server übertragen. Dann warte ich bis die Anfrage fertig ist und lese die Antwort in ein ByteArray. Das Funktioniert auch total Super aber ich möchte jetzt mit meinem Code der etwas unnötiger weise in Excel verankert ist ganz gerne ein eigenständiges Modul erstellen. Der Gedanke dabei ist das man das Modul dann Automatisiert starten lässt und den Overhead der durch Excel erzeugt wird etwas reduziert. Vorzugsweise wollte ich nun die Anwendung in Java umsetzen. Das Commandlinetool lässt sich auch schon Komfortabler ansprechen als aus VBA heraus aber mit dem Download hab ich noch Probleme. Den Download einer Datei die NICHT hinter der Benutzeranmeldung liegt bekomme ich hin. Allerdings schaffe ich es nicht mich an Anwendung 2 anzumelden... Hat einer eine gute Idee? Ich bin für jeden Ratschlag dankbar Gruß Oggie85 Zitieren
flashpixx Geschrieben 14. Oktober 2010 Geschrieben 14. Oktober 2010 Das hat nichts mit Java zu tun, also verschieb' ich es mal passend.... Zitieren
Oggie85 Geschrieben 18. Oktober 2010 Autor Geschrieben 18. Oktober 2010 Naja ... das hat schon was mit Java zu tun, da ich es ja in Java implementieren möchte... Zitieren
Oggie85 Geschrieben 18. Oktober 2010 Autor Geschrieben 18. Oktober 2010 Das ist zur zeit mein aktueller stand... import java.io.DataInputStream; import java.io.FileOutputStream; import java.net.Authenticator; import java.net.HttpURLConnection; import java.net.URL; import java.util.Properties; public class test001 { public static void main(String args[]) { dump("http://www.yahoo.com"); System.out.println("**************"); dump("https://www.paypal.com"); System.out.println("**************"); dump("https://my-url.xy"); System.out.println("**************"); } public static void dump(String URLName) { Authenticator.setDefault(new MyAuthenticator()); try { DataInputStream di = null; FileOutputStream fo = null; String proxy = "my-company.proxy.de"; String port = "8080"; String userPw = "user.name:password"; byte[] b = new byte[1]; // PROXY Properties systemSettings = System.getProperties(); systemSettings.put("http.proxyHost", proxy); systemSettings.put("http.proxyPort", port); URL u = new URL(URLName); HttpURLConnection con = (HttpURLConnection) u.openConnection(); // HttpURLConnection.setFollowRedirects(true); // con.setInstanceFollowRedirects(false); //Base64Coder encoder = new Base64Coder(); String encodedUserPwd = Base64Coder.encode(userPw.getBytes()); con.setRequestProperty("Proxy-Authorization", "Basic " + encodedUserPwd); // PROXY ---------- di = new DataInputStream(con.getInputStream()); while (-1 != di.read(b, 0, 1)) { System.out.print(new String(); } } catch (Exception e) { e.printStackTrace(); } } } [/code] Gebe ich nur die Basis-URL ein sehe ich zumindest schon mal den HTML-Code. Gebe ich aber die Adresse zu dem Download an, bekomme ich folgenden Fehler: [code] java.net.ProtocolException: Server redirected too many times (20) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1323) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:373) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318) at test001.dump(test001.java:55) at test001.main(test001.java:17) Im Internet habe ich dazu gefunden das es einen Redirect gibt der nicht automatisch verfolgt wird. Die Lösung dazu ist der Auskommentierte teil HttpURLConnection.setFollowRedirects(true); con.setInstanceFollowRedirects(false); Lass ich mir aber die URL, der ich folgen soll, ausgeben con.getHeaderField("Location")ist es eine interne Adresse des Zielsystems (http://123.456.78.90:8080) Ich drehe mich jetzt etwas im Kreis... Ursprünglich wollte ich das mittels XMLhttpRequest (HttpClient - HttpClient Home) lösen in der Hoffnung, dass ich die Klasse in etwa so benutzen könne wie die Implementierung unter VBA. Dies zeigte sich aber als komplizierter als erwartet... Jetzt habe ich den Gedanken gehabt, dass ich den Download mit Java-Boardmitteln lösen könne. Komme aber mit dem obigen Code auch nicht weiter... Hat hier noch jemand einen guten Gedanke? Gruß Oggie85 Zitieren
Oggie85 Geschrieben 27. Oktober 2010 Autor Geschrieben 27. Oktober 2010 So habs hinbekommen... ich habe nach einem alternativen Package gesucht und bin dabei auf httpunit (HttpUnit Home) gestoßen. Dieses Package ist SEHR interessant wie ich finde... Naja ich konnte meinen Donwload somit wie folgt lösen: private static void downloadFiel(String path, String link) { // create the conversation object WebConversation wc = new WebConversation(); // Proxy wc.setProxyServer(Proxy, ProxyPort); // Authentication wc .setAuthentication(realm, User, UserPass); // Obtain next page WebRequest request = new GetMethodWebRequest(link); WebResponse response = null; float contentLength = response.getContentLength(); // get all links on this page InputStream di = null; try { di = response.getInputStream(); } catch (IOException ioe) { log.error(ioe); } FileOutputStream fo = null; try { fo = new FileOutputStream(path); } catch (FileNotFoundException e) { DownOmat.log.error(e); } byte[] b = new byte[1]; try { // write the file byte wise while (-1 != di.read(b, 0, 1)) { fo.write(; } } catch (IOException e) { log.error(e); } try { fo.close(); } catch (IOException e) { log.error(e); } // Clear all request... wc.clearContents(); response.close(); } [/code] Gruß Oggie85 PS.: Problem geklärt, kann geschlossen werden. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.