2011-01-07 42 views
22

Tôi phải tải xuống và phân tích cú pháp các tệp XML từ máy chủ http với xác thực HTTP cơ bản. Bây giờ tôi đang thực hiện theo cách này:Yêu cầu HTTP có xác thực cơ bản

URL url = new URL("http://SERVER.WITHOUT.AUTHENTICATION/some.xml"); 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document doc = db.parse(new InputSource(url.openStream())); 
    doc.getDocumentElement().normalize(); 

Nhưng theo cách đó tôi không thể nhận được tài liệu xml (hoặc tôi chỉ đơn giản là không biết điều đó) từ máy chủ có xác thực http.

Tôi sẽ thực sự biết ơn nếu bạn có thể chỉ cho tôi cách tốt nhất và dễ nhất để đạt được mục tiêu của mình.

Trả lời

56

Bạn có thể sử dụng Authenticator. Ví dụ:

Authenticator.setDefault(new Authenticator() { 
@Override 
     protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(
    "user", "password".toCharArray()); 
     } 
}); 

này đặt mặc định Authenticator và sẽ được sử dụng trong tất cả các yêu cầu. Rõ ràng là thiết lập có liên quan nhiều hơn khi bạn không cần thông tin đăng nhập cho tất cả các yêu cầu hoặc một số thông tin đăng nhập khác nhau, có thể trên các chủ đề khác nhau.

Hoặc bạn có thể sử dụng một DefaultHttpClient nơi một yêu cầu GET với xác thực HTTP cơ bản sẽ trông tương tự như:

HttpClient httpClient = new DefaultHttpClient(); 
HttpGet httpGet = new HttpGet("http://foo.com/bar"); 
httpGet.addHeader(BasicScheme.authenticate(
new UsernamePasswordCredentials("user", "password"), 
"UTF-8", false)); 

HttpResponse httpResponse = httpClient.execute(httpGet); 
HttpEntity responseEntity = httpResponse.getEntity(); 

// read the stream returned by responseEntity.getContent() 

tôi khuyên bạn nên sử dụng sau này vì nó mang lại cho bạn rất nhiều kiểm soát nhiều hơn (ví dụ như phương pháp, tiêu đề, timeouts , vv) theo yêu cầu của bạn.

+0

Bây giờ, tôi đang nhận được mã 107 không hợp lệ lỗi json. Tôi đã kiểm tra json của tôi trên json lint thích hợp của nó. Vì vậy, làm thế nào để thoát khỏi lỗi này. cảm ơn –

+0

Đã giao phối! đang thực hiện yêu cầu POST, phải thực hiện GET. –

2

Sử dụng HttpClient. Tài liệu để thực hiện tải xuống với HTTP AUTH là here. Tài liệu để nhận kết quả chuỗi là here. Sau đó, phân tích cú pháp chuỗi của bạn (lý tưởng là sử dụng SAX, tuy nhiên, không phải DOM).

6
public String reloadTomcatWebApplication(String user, String pwd, String urlWithParameters, boolean returnResponse) { 
    URL url = null; 
    try { 
     url = new URL(urlWithParameters); 
    } catch (MalformedURLException e) { 
     System.out.println("MalformedUrlException: " + e.getMessage()); 
     e.printStackTrace(); 
     return "-1"; 
    } 

    URLConnection uc = null; 
    try { 
     uc = url.openConnection(); 
    } catch (IOException e) { 
     System.out.println("IOException: " + e.getMessage()); 
     e.printStackTrace(); 
     return "-12"; 
    } 


    String userpass = user + ":" + pwd; 
    String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes()); 

    uc.setRequestProperty("Authorization", basicAuth); 
    InputStream is = null; 
    try { 
     is = uc.getInputStream(); 
    } catch (IOException e) { 
     System.out.println("IOException: " + e.getMessage()); 
     e.printStackTrace(); 
     return "-13"; 
    } 
    if (returnResponse) { 
     BufferedReader buffReader = new BufferedReader(new InputStreamReader(is)); 
     StringBuffer response = new StringBuffer(); 

     String line = null; 
     try { 
      line = buffReader.readLine(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return "-1"; 
     } 
     while (line != null) { 
      response.append(line); 
      response.append('\n'); 
      try { 
       line = buffReader.readLine(); 
      } catch (IOException e) { 
       System.out.println(" IOException: " + e.getMessage()); 
       e.printStackTrace(); 
       return "-14"; 
      } 
     } 
     try { 
      buffReader.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return "-15"; 
     } 
     System.out.println("Response: " + response.toString()); 
     return response.toString(); 
    } 
    return "0"; 
} 
+1

Tôi thích biến thể này vì nó không phụ thuộc vào API bên ngoài và cụ thể cho truy vấn. –

2
  • DefaultHttpClient phản
  • addHeader phải có 2 thông số

Cập nhật mã khối sử dụng HttpClient 4.5.2

HttpClient httpClient = HttpClientBuilder.create().build(); 
HttpGet httpGet = new HttpGet("https://test.com/abc.xyz"); 
httpGet.addHeader("Authorization", BasicScheme.authenticate(new UsernamePasswordCredentials("login", "password"), "UTF-8")); 

HttpResponse httpResponse = httpClient.execute(httpGet); 
HttpEntity responseEntity = httpResponse.getEntity(); 
+0

Phương thức xác thực từ BasicScheme đã không được chấp nhận –

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