2009-08-31 21 views
34

Tôi cố gắng để gửi một GET qua Android của HttpURLConnection (nhập khẩu từ org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection), và khi nhận được câu trả lời, một IOException được ném :IOException: "Nhận thách thức xác thực là null" (Apache Harmony/Android)

trong doRequestInternal(): "nhận thách thức xác thực là null"

không lỗi này có ý nghĩa gì, và những gì đang gây ra điều này? Tôi đang viết tham số OAuth cho tiêu đề Cấp quyền, nhưng tôi cũng làm điều này vào những dịp khác, mà không gặp sự cố.

if (connection == null) { 
     connection = (HttpURLConnection) new URL(endpointUrl).openConnection(); 
     connection.setRequestMethod("GET"); 
    } 

    //... do some OAuth message signing 

    connection.connect(); 

    int statusCode = connection.getResponseCode(); // throws IOException 
+0

tính năng này phù hợp với tôi http://stackoverflow.com/a/9894629/3758898 –

Trả lời

50

Tôi đã tìm ra lý do.

Trước hết, cho tất cả những ai không biết ý nghĩa của lỗi này (Tôi chắc chắn không phải): Trường hợp ngoại lệ này được ném nếu máy chủ trả lời bằng 401. Rất trực quan, xem xét nó đã được ném vào getResponseCode() (iow bạn không bao giờ có thể tự kiểm tra 401, nhưng phải bắt IOException này thay vì ...).

Nguyên nhân thực sự cho 401 là tôi đã không gửi mã xác minh OAuth mà nó được mong đợi vào thời điểm này.

+0

Hi Matthias, bạn có đang sử dụng api twitter không? – MounirReg

+1

không có tôi chạy vào vấn đề này như là một phần của việc thực hiện DefaultOAuthProvider cho biển hiệu, trong đó sử dụng HTTPUrlConnection thay vì Apache HttpClient. – Matthias

+0

Bạn có dính vào biển hiệu không? Tôi gặp rất nhiều rắc rối với nó trên Android. –

13

Có lẽ sẽ có ích cho ai đó ...

ngoại lệ này chỉ có nghĩa là tiêu đề câu trả lời bị thay đổi: các "WWW-Authenticate" tiêu đề đã không được tìm thấy. Ngoài ra, các câu trả lời chunked với mã 401 không được hỗ trợ, vì vậy bạn sẽ cần tiêu đề "Content-Length" (có thể bằng không).

+0

hoặc tiêu đề "Ủy quyền" – Matthias

+4

Khách hàng cần gửi tiêu đề "Ủy quyền" và nếu máy chủ không thích thông tin đăng nhập cần phải gửi lại 'WWW-Authenticate'. Trong trường hợp của tôi, đó là máy chủ của chúng tôi và nó đang gửi 'WWW-Authenticate' chỉ khi tiêu đề' Authorization' bị thiếu. Để khắc phục lỗi trong chủ đề, chúng tôi đã thực hiện thay đổi ở phía máy chủ để gửi 'WWW-Authenticate' khi Ủy quyền không thành công. – katit

4

Chỉ cần thêm tiêu đề này để yêu cầu (ở phía máy chủ):

WWW-Authenticate: None 
2

Xin lưu ý rằng có hai cách tiếp cận xác thực: HTTP Authenticationtoken-based authentication. Nếu bạn đang sử dụng Xác thực HTTP thì bạn phải tuân thủ đặc tả tham chiếu: bao gồm WWW-Authenticate trường tiêu đề ở phía máy chủ, sử dụng java.net.Authenticator cục bộ, v.v. Nếu bạn đang sử dụng xác thực dựa trên mã thông báo thì rõ ràng bạn phải sử dụng cookie để lưu trữ mã thông báo và có thể giữ các phiên sống lâu. Trong trường hợp này đặt mã sau vào android.app.Application.onCreate()

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

và bạn sẽ không có rắc rối khi nhận được HTTP 401 từ máy chủ mà không cần WWW-Authenticate lĩnh vực tiêu đề.

Các vấn đề liên quan