2012-07-30 46 views
5

Tôi đang cố gắng GET url bằng HTTPUrlConnection, tuy nhiên tôi luôn nhận được 500 mã, nhưng khi tôi cố gắng truy cập cùng một url đó từ trình duyệt hoặc sử dụng curl, nó hoạt động tốt!Java HTTPUrlConnection trả lại 500 mã trạng thái

Đây là mã

try{ 
    URL url = new URL("theurl"); 
    HttpURLConnection httpcon = (HttpURLConnection) url.openConnection(); 
    httpcon.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
    httpcon.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:14.0) Gecko/20100101 Firefox/14.0.1"); 
    System.out.println(httpcon.getHeaderFields()); 
    }catch (Exception e) { 
     System.out.println("exception "+e); 
    } 

Khi tôi in headerfields, nó cho thấy mã 500 .. khi tôi thay đổi URL để cái gì khác như google.com, nó hoạt động tốt. Nhưng tôi không hiểu tại sao nó không hoạt động ở đây nhưng nó hoạt động tốt trên trình duyệt và với curl.

Bất kỳ trợ giúp sẽ được đánh giá cao ..

Cảm ơn bạn,

+0

500 dành cho lỗi máy chủ nội bộ –

+0

whatur 'theurl' mà bạn đã thử? – sunil

+0

@sunil Tôi đã thử http://www.rassd.com/1-23544.htm – user1069624

Trả lời

1

Đảm bảo rằng kết nối của bạn cho phép chuyển hướng sau đây - đây là một trong những lý do có thể có khác biệt về hành vi giữa kết nối của bạn và trình duyệt (cho phép chuyển hướng theo mặc định).

Mã phải trả về mã 3xx, nhưng có thể có điều gì khác ở nơi nào đó thay đổi thành 500 cho kết nối của bạn.

+0

emm .. Tôi không nghĩ đây là vấn đề, bởi vì im không được chuyển hướng khi tôi thử nó trong trình duyệt .. nhưng cảm ơn cho gợi ý. – user1069624

+0

Đọc thêm chi tiết lỗi từ luồng lỗi theo đề xuất của Muse. Nếu nó không phải là chuyển hướng hơn so với khả năng khác duy nhất tôi có thể nghĩ là máy chủ đang mong đợi một cái gì đó khác (cookie, loại khác của tiêu đề) trong yêu cầu của bạn. Tôi sẽ sao chép TẤT CẢ tiêu đề được thông qua bởi trình duyệt của bạn trong yêu cầu thành công (nó sẽ dẫn đến cuộc gọi HttpURLConnection thành công) và hơn làm việc theo cách của tôi ngược lại loại bỏ một tiêu đề tại một thời điểm. –

+0

OK Tôi nghĩ rằng tôi biết những gì sai .. Trang thực sự là xuống nhưng từ trình duyệt tôi nghĩ rằng nó được sử dụng để có được phiên bản lưu trữ .. có thể đó là nó? bởi vì trang đó không hoạt động .. nhưng khi tôi thử một trang khác trong cùng một máy chủ .. nó hoạt động! – user1069624

7

Điều này chủ yếu xảy ra do mã hóa. Nếu bạn đang sử dụng trình duyệt OK, nhưng nhận được 500 (lỗi máy chủ nội bộ) trong chương trình của bạn, đó là bởi vì các trình duyệt có một mã rất phức tạp về bộ ký tự và kiểu nội dung.

Đây là mã của tôi và mã hoạt động trong trường hợp ISO8859_1 là ngôn ngữ ký tự và tiếng Anh.

public void sendPost(String Url, String params) throws Exception { 


    String url=Url; 
    URL obj = new URL(url); 
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); 

    con.setRequestProperty("Acceptcharset", "en-us"); 
    con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 
    con.setRequestProperty("charset", "EN-US"); 
    con.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); 
    String urlParameters=params; 
    // Send post request 
    con.setDoOutput(true); 
    con.setDoInput(true); 
    con.connect(); 
    //con. 

    DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 
    wr.writeBytes(urlParameters); 
    wr.flush(); 
    wr.close(); 

    int responseCode = con.getResponseCode(); 
    System.out.println("\nSending 'POST' request to URL : " + url); 
    System.out.println("Post parameters : " + urlParameters); 
    System.out.println("Response Code : " + responseCode); 

    BufferedReader in = new BufferedReader(
      new InputStreamReader(con.getInputStream())); 
    String inputLine; 
    StringBuffer response = new StringBuffer(); 

    while ((inputLine = in.readLine()) != null) { 
     response.append(inputLine); 
    } 
    in.close(); 

    //print result 
    System.out.println(response.toString()); 
    this.response=response.toString(); 
    con.disconnect(); 

} 

và trong chương trình chính, gọi nó là như thế này:

myclassname.sendPost("https://change.this2webaddress.desphilboy.com/websitealias/orwebpath/someaction","paramname="+URLEncoder.encode(urlparam,"ISO8859_1")) 
2

Tôi chạy vào vấn đề "URL hoạt động trong trình duyệt, nhưng khi tôi làm http-get trong java tôi nhận được một 500 Lỗi".

Trong trường hợp của tôi vấn đề là http-get thường kết thúc trong một vòng lặp vô hạn chuyển hướng giữa /default.aspx và /login.aspx

 URL oUrl = new URL(url); 
     HttpURLConnection con = (HttpURLConnection) oUrl.openConnection(); 
     con.setRequestMethod("GET"); 
     ... 
     int responseCode = con.getResponseCode(); 

gì đã xảy ra là: Các máy chủ phục vụ lên một cookie ba phần và con.getResponseCode() chỉ sử dụng một trong các phần. Dữ liệu cookie trong tiêu đề trông giống như sau:

header.key = null 
    value = HTTP/1.1 302 Found 
... 
header.key = Location 
    value = /default.aspx 
header.key = Set-Cookie 
    value = WebCom-lbal=qxmgueUmKZvx8zjxPftC/bHT/g/rUrJXyOoX3YKnYJxEHwILnR13ojZmkkocFI7ZzU0aX9pVtJ93yNg=; path=/ 
    value = USE_RESPONSIVE_GUI=1; expires=Wed, 17-Apr-2115 18:22:11 GMT; path=/ 
    value = ASP.NET_SessionId=bf0bxkfawdwfr10ipmvviq3d; path=/; HttpOnly 
... 

Vì vậy, máy chủ khi chỉ nhận được một phần ba dữ liệu cần thiết đã bị nhầm lẫn: Bạn đã đăng nhập! Không đợi, bạn phải đăng nhập. Không, bạn đã đăng nhập, ...

Để làm việc xung quanh vòng lặp chuyển hướng vô hạn, tôi phải tìm kiếm lại theo cách thủ công và phân tích thủ công tiêu đề cho mục nhập "Đặt cookie".

  con = (HttpURLConnection) oUrl.openConnection(); 
      con.setRequestMethod("GET"); 
      ... 
      log.debug("Disable auto-redirect. We have to look at each redirect manually"); 
      con.setInstanceFollowRedirects(false); 
      .... 
      int responseCode = con.getResponseCode(); 

Với mã này các phân tích của các tập tin cookie, nếu chúng ta có được một chuyển hướng trong responseCode:

private String getNewCookiesIfAny(String origCookies, HttpURLConnection con) { 
    String result = null; 
    String key; 
    Set<Map.Entry<String, List<String>>> allHeaders = con.getHeaderFields().entrySet(); 
    for (Map.Entry<String, List<String>> header : allHeaders) { 
     key = header.getKey(); 

     if (key != null && key.equalsIgnoreCase(HttpHeaders.SET_COOKIE)) { 
      // get the cookie if need, for login 
      List<String> values = header.getValue(); 
      for (String value : values) { 
       if (result == null || result.isEmpty()) { 
        result = value; 
       } else { 
        result = result + "; " + value; 
       } 
      } 
     } 
    } 
    if (result == null) { 
     log.debug("Reuse the original cookie"); 
     result = origCookies; 
    } 
    return result; 
} 
0

Trong trường hợp của tôi nó bật ra rằng máy chủ luôn luôn trả về HTTP/1.1 500 (trong Trình duyệt như trong Java) cho trang mà tôi muốn truy cập, nhưng dù sao vẫn cung cấp nội dung trang web thành công.

Một người truy cập trang cụ thể qua Trình duyệt không nhận thấy, vì anh ta sẽ thấy trang và không có thông báo lỗi, trong Java tôi phải đọc luồng lỗi thay vì luồng đầu vào (nhờ @Muse).

Tôi không biết tại sao. Có thể là một số cách tối nghĩa để giữ cho Trình thu thập thông tin ra ngoài.

0

Đây là một câu hỏi cũ, nhưng tôi đã có cùng một vấn đề và giải quyết nó theo cách này.

Điều này có thể giúp tình huống tương tự khác.

Trong trường hợp của tôi, tôi đã phát triển hệ thống trên môi trường địa phương, và mọi thứ hoạt động tốt khi tôi kiểm tra Rest Api từ trình duyệt nhưng tôi đã bỏ tất cả thời gian lỗi HTTP 500 vào hệ thống Android của mình. Vấn đề là khi bạn làm việc trên Android, nó hoạt động trên máy ảo (Virtual Machine), có nghĩa là tường lửa máy tính cục bộ của bạn có thể ngăn máy ảo của bạn truy cập địa chỉ URL cục bộ (IP).

Bạn chỉ cần cho phép điều đó trong tường lửa máy tính của mình. Điều tương tự cũng áp dụng nếu bạn cố truy cập hệ thống từ bên ngoài mạng của mình.

0

Tôi gặp vấn đề tương tự và vấn đề của chúng tôi là có một biểu tượng đặc biệt ở một trong các giá trị tham số. Chúng tôi đã sửa lỗi bằng cách sử dụng URLEncoder.encode(String, String)

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