Java Ausfall der Kommunikation durch web-proxy mit Apache HttpClient

Ich habe einen desktop-client sendet Daten an einen web-server, und ich kann nicht scheinen, um durch den proxy-server.

Update: ich bin immer ein 407 HTTP-Fehler, wenn Sie versuchen zu kommunizieren, durch den proxy.

Beim herunterladen von Daten von meinem web-server ist alles in Ordnung. Sobald der Benutzer konfiguriert den proxy-server (unter Verwendung einer dialog-box, die ich schrieb) funktioniert der download einwandfrei. Aber das hochladen von Daten mit org.apache.http.client.HttpClient nicht funktioniert.

Ich bin der Konfiguration der proxy-server mit code wie diesem nach sammeln die Daten aus einem JDialog.

        System.setProperty("http.proxyHost", proxyHost);
        System.setProperty("http.proxyPort", "" + portNumber);

Nun, wenn wir das tun, einfache downloads funktionieren. Zum Beispiel habe ich code, der liest xml-Daten von meinem web-server (siehe unten). Auf das Netzwerk des Kunden den Fehler in meinem catch-block angezeigt wurde, bevor Sie die proxy-Einstellungen wurden konfiguriert und dann lief alles in Ordnung, wenn der richtige proxy eingestellt war.

/**
 * Loads a collection of exams from the web site. The URL is determined by
 * configuration or registration since it is State specific.
 */
public static int importExamsWS(StringBuilder msg) {
    try {
        java.net.URL onlineExams = new URL(examURL);
        //Parse the XML data from InputStream and store it.
        return importExams(onlineExams.openStream(), msg);

    } 
    catch (java.net.UnknownHostException noDNS) {
        showError(noDNS, "Unable to connect to proctinator.com to download the exam file.\n"
                + "There is probably a problem with your Internet proxy settings.");
    }
    catch (MalformedURLException | IOException duh) {
        showFileError(duh);
    }
    return 0;
}

Jedoch, wenn ich versuche zu SENDEN von Daten an den web-server es ist, als ob die proxy-Einstellungen werden ignoriert, und eine IOException wird ausgelöst. Nämlich:

org.apache.http.conn.HttpHostConnectException: Connection to http://proctinator.com:8080 refused

Jetzt weiß ich, dass port 8080 ist nicht blockiert durch den Kunden in der web-filter denn getestet haben wir die Adresse in einem web-browser.

Hier ist mein code für die überprüfung der Registrierungs-ID vom Benutzer eingegeben:
Update: Jetzt bin ich auch die Einstellung der proxy in dieser Methode.

//Registered is just an enum with ACTIVE, INACTIVE, NOTFOUND, ERROR
public static Registered checkRegistration(int id) throws IOException {    
    httpclient = new DefaultHttpClient();
    Config pref = Config.getConfig(); //stores user-entered proxy settings.
    HttpHost proxy = new HttpHost(pref.getProxyServer(), pref.getProxyPort());
    httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
    URIBuilder builder = new URIBuilder();
    String path = "/Proctorest/rsc/register/" + id;
    try {
        builder.setScheme("http").setHost(server).setPort(8080).setPath(path);
        URI uri = builder.build();
        System.out.println("Connecting to " + uri.toString());
        HttpGet httpget = new HttpGet(uri);
        HttpResponse response = httpclient.execute(httpget);
        System.out.println(response.getStatusLine().toString());
        if(response.getStatusLine().getStatusCode()==200) {
            String msg = EntityUtils.toString(response.getEntity());
            GUI.globalLog.log(Level.INFO, "Server response to checkRegistration(" + id + "): " + msg);
            return Registered.stringToRegistered(msg);
        }
        else {
            GUI.globalLog.log(Level.INFO, "Server response status code to checkRegistration: " + 
                    response.getStatusLine().getStatusCode());
            return Registered.ERROR;
        }
    }
    catch(java.net.URISyntaxException bad) {
        System.out.println("URI construction error: " + bad.toString());
        return Registered.ERROR;
    }
}

Ich bin mir fast sicher, dass das problem kommt von der proxy-server-Konfiguration, noch der docs für SystemDefaultHttpClient behaupten, dass es dauert, das System-Eigenschaften für http.proxyHost und http.proxyPort . Ich weiß, dass die Eigenschaften sind richtig eingestellt, ich bin aber noch dabei diese Authentifizierung Fehler. Anzeigen der generierten Protokolle von meinem Programm zeigte mir dieses:

checkRegistration INFO: Server response status code to checkRegistration: 407 

Wie kann ich dies beheben-Authentifizierung ein Fehler?

  • Wie Sie Daten senden? eine POST? eine PUT? ein GET mit Parametern? Sorry, ich kann nicht finden, Ihre Frage.
  • Wir verwenden hier ERHALTEN. Andere Methoden, die nicht gezeigt ist verwenden Sie den POST. Im code oben bemerkt HttpGet httpget = new HttpGet(uri);
  • Können Sie einen proxy in Ihrem dev-Umgebung, dann auf der dev-Maschine, verwenden Sie die firewall blockiert alle ausgehenden http -, ausser dem proxy?
  • Proxy-Konfiguration ist außerhalb meiner Fähigkeiten eingestellt. Ich habe Windows Vista und Apache-Web-server auf meine dev-Maschine. Ist es Osten, um einen proxy?
  • Squid ist leicht genug, um set-up. Aber Sie müssen zum einrichten der proxy auf einem separaten Rechner, andernfalls die firewall-Konfiguration ist irrelevant.
  • Schicken Sie Ihre Daten als Json?
  • Ich bin nicht mit JSON. In dem obigen Beispiel die Registrierung ist nur geschickt als Teil des Pfades. Anderen Methoden nur codieren form von Daten - plain-text. Ich habe auch das senden von Daten durch die Veröffentlichung von xml-und csv-Datei.
  • Überprüfen Sie die Aktualisierung. Ich bin immer ein 407 HTTP-Fehler.
  • Einfach nur neugierig - ist der proxy-server die Verwendung der basic-oder NTLM-Authentifizierung?
  • andere Frage - gibt es irgendeine proxy-server-Informationen angegeben in den browser-Einstellungen?
  • Sind Sie proxying über den server (auf einem anderen server) oder du bist über proxy in Ihrer Anwendung?
  • Der browser einen proxy-Konfiguration, und ich bin über einen proxy-Konfiguration in meiner app, wie gezeigt, in der code, den ich gepostet.

InformationsquelleAutor Thorn | 2012-06-28
Schreibe einen Kommentar