2010-01-28 42 views
7

Tôi đang cố gắng viết chương trình để thực hiện kiểm tra tự động trên webapp của tôi. Để thực hiện điều này, tôi mở một kết nối bằng cách sử dụng HttpURLConnection.Java HttpURLConnection không kết nối khi tôi gọi kết nối()

Một trong những trang mà tôi đang cố gắng kiểm tra thực hiện chuyển hướng 302. mã kiểm tra của tôi trông như thế này:

URL currentUrl = new URL(urlToSend); 
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection(); 
connection.connect(); 
system.out.println(connection.getURL().toString()); 

Vì vậy, chúng ta hãy nói rằng urlToSend là http://www.foo.com/bar.jsp, và rằng trang này chuyển hướng bạn đến http://www.foo.com/quux.jsp. Tuyên bố println của tôi sẽ in ra http://www.foo.com/quux.jsp, phải không?

WRONG.

Chuyển hướng không bao giờ xảy ra và nó sẽ in ra URL gốc. Tuy nhiên, nếu tôi thay đổi chuyển đổi dòng connection.connect() với một cuộc gọi đến connection.getResponseCode(), nó hoạt động một cách kỳ diệu.

URL currentUrl = new URL(urlToSend); 
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection(); 
//connection.connect(); 
connection.getResponseCode(); 
system.out.println(connection.getURL().toString()); 

Tại sao tôi thấy hành vi này? Tôi có làm gì sai không?

Cảm ơn sự giúp đỡ.

Trả lời

16

Phương thức connect() chỉ tạo kết nối. Bạn phải cam kết yêu cầu (bằng cách gọi getInputStream(), getResponseCode() hoặc getResponseMessage()) để phản hồi được trả lại và xử lý.

+0

Cảm ơn bạn, điều này có vẻ như vậy! – sangfroid

+1

Cảm ơn bạn vì điều này! Đã cố gắng hiểu tại sao mọi người đang phát hành getInputStream() và như vậy mà không bao giờ gọi kết nối(). Bạn chỉ cần làm rõ điều đó với tôi. – Renatinn

0

Hãy thử setFollowRedirects, vì nó có thể hữu ích. Trên thực tế, hãy thử getFollowRedirects để xem đó có phải là sự cố hay không (không phải vì nó là sự thật theo mặc định).

Edit: Nếu đây không phải là vấn đề của bạn, tôi sẽ cố gắng đọc một cái gì đó từ kết nối (như bạn làm với getResponseCode nhưng tôi sẽ cố gắng cũng getHeaderField để xem nếu đọc bất cứ điều gì ở tất cả làm cho chuyển hướng để được tôn trọng).

+0

Đã cố gắng đó, getFollowRedirects trả về true. Ngoài ra, tôi đang gặp một vấn đề riêng với setFollowRedirects trong một thử nghiệm riêng biệt. Về cơ bản, setInstanceFollowRedirects() không làm bất cứ điều gì, trong khi setFollowRedirects() làm những gì nó được cho là. Tuy nhiên, tôi nghĩ sẽ tốt hơn khi hỏi về điều đó trong một bài đăng riêng biệt vì đó là một vấn đề riêng biệt. – sangfroid

+1

@sangfroid Tôi nghĩ rằng bạn sẽ thấy rằng bạn phải thực sự đọc một cái gì đó từ kết nối để có được chuyển hướng được đọc/tôn trọng. –

1

Phương thức connect() được triển khai trong lớp URLConnection và không bị ghi đè bởi lớp HttpURLConnection.

Lớp URLConnection không biết HTTP và do đó không nên theo chuyển hướng HTTP ngay cả khi nó đang tạo kết nối thực.

Nếu bạn muốn hành vi nội tại đối với giao thức HTTP, bạn có thể muốn gắn vào các phương thức được triển khai trong lớp HttpURLConnection, như phương thức getResponseCode().

0

Thêm dòng sau trong onCreate của bạn

StrictMode.ThreadPolicy policy = new StrictMode. 
ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
Các vấn đề liên quan