Tôi có một ứng dụng khách trên máy tính để bàn gửi dữ liệu đến máy chủ web và dường như tôi không thể truy cập máy chủ proxy.Giao tiếp Java không thành công thông qua proxy web bằng cách sử dụng Apache HttpClient
Cập nhật: Tôi gặp phải lỗi HTTP 407 khi cố giao tiếp thông qua proxy.
Khi tải xuống thông tin từ máy chủ web của tôi, mọi thứ đều ổn. Một khi người dùng cấu hình máy chủ proxy (sử dụng một hộp thoại tôi đã viết) tải xuống hoạt động tốt. Tuy nhiên, việc tải lên dữ liệu bằng cách sử dụng org.apache.http.client.HttpClient không hoạt động.
Tôi định cấu hình máy chủ proxy có mã như sau sau khi thu thập thông tin từ JDialog.
System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", "" + portNumber);
Bây giờ, khi chúng tôi làm điều đó, tải xuống đơn giản hoạt động tốt. Ví dụ, tôi có mã đọc một số dữ liệu xml từ máy chủ web của tôi (xem bên dưới). Trên mạng của khách hàng, lỗi trong khối catch của tôi được hiển thị trước khi cài đặt proxy được định cấu hình và sau đó mọi thứ hoạt động tốt khi proxy đã được đặt chính xác.
/**
* 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;
}
Tuy nhiên, khi tôi cố gắng gửi dữ liệu đến máy chủ web, như thể cài đặt proxy bị bỏ qua và IOException bị ném. Cụ thể:
org.apache.http.conn.HttpHostConnectException: Connection to http://proctinator.com:8080 refused
Bây giờ tôi biết rằng cổng 8080 không bị chặn bởi bộ lọc web của khách hàng vì chúng tôi đã kiểm tra địa chỉ trong trình duyệt web.
Đây là mã của tôi để xác minh ID đăng ký được người dùng nhập: Cập nhật: Bây giờ tôi cũng đặt proxy trong phương thức này.
//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;
}
}
Tôi gần như tích cực rằng vấn đề xuất phát từ cấu hình máy chủ proxy, nhưng các docs for SystemDefaultHttpClient tuyên bố rằng nó cần sử dụng thuộc tính hệ thống cho http.proxyHost
và http.proxyPort
. Tôi biết rằng các thuộc tính đã được đặt đúng, nhưng tôi vẫn nhận được lỗi xác thực này. Xem nhật ký được tạo từ chương trình của tôi đã cho tôi biết điều này:
checkRegistration INFO: Server response status code to checkRegistration: 407
Làm cách nào để giải quyết lỗi xác thực này?
Bạn gửi dữ liệu bằng cách nào? một POST? một PUT? GET với các tham số? Xin lỗi, tôi không thể tìm ra câu hỏi của bạn. –
Chúng tôi đang sử dụng GET tại đây. Các phương pháp khác không được hiển thị sử dụng POST. Trong đoạn mã trên, hãy chú ý HttpGet httpget = new HttpGet (uri); – Thorn
Bạn có thể thiết lập một proxy trong môi trường dev của bạn, sau đó trên máy dev của bạn, sử dụng tường lửa để chặn tất cả http đi, khác với proxy? – artbristol