2012-07-30 13 views
5

देता है मैं HTTPUrlConnection का उपयोग करके एक यूआरएल प्राप्त करने की कोशिश कर रहा हूं, हालांकि मुझे हमेशा 500 कोड मिल रहा है, लेकिन जब मैं ब्राउज़र से उसी यूआरएल तक पहुंचने का प्रयास करता हूं या कर्ल का उपयोग करता हूं, तो यह ठीक काम करता है!जावा HTTPUrlConnection 500 स्थिति कोड

यह जब मैं headerfields प्रिंट, यह 500 कोड से पता चलता है जब मैं और google.com की तरह कुछ करने के लिए URL बदल यह ठीक काम करता है कोड

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); 
    } 

है ..,। लेकिन मुझे समझ में नहीं आता कि यह यहां क्यों काम नहीं करता है लेकिन यह ब्राउज़र पर और कर्ल के साथ ठीक काम करता है।

किसी भी मदद अत्यधिक सराहना की जाएगी ..

धन्यवाद,

+0

500 आंतरिक सर्वर त्रुटि –

+0

का उपयोग करके तय किया है जो आपने किया है 'theurl''? – sunil

+0

@ सुनील मैं कोशिश कर रहा था http://www.rassd.com/1-23544.htm – user1069624

उत्तर

6

स्थिति कोड 500 चलता है कि वेब सर्वर पर कोड .Use HttpURLConnection#getErrorStream() दुर्घटनाग्रस्त हो गया है त्रुटि के अधिक विचार प्राप्त करने के। Http Status Code 500

+0

मैंने getErrorStream की कोशिश की लेकिन यह शून्य लौटाता है .. – user1069624

1

सुनिश्चित करें कि आपका कनेक्शन रीडायरेक्ट के बाद अनुमति देता है - यह आपके कनेक्शन और ब्राउज़र (डिफ़ॉल्ट रूप से रीडायरेक्ट की अनुमति देता है) के बीच व्यवहार में अंतर के संभावित कारणों में से एक है।

यह कोड 3xx लौटाया जाना चाहिए, लेकिन शायद कहीं और कहीं और आपके कनेक्शन के लिए इसे 500 में बदल सकता है।

+0

emm .. मुझे नहीं लगता कि यह समस्या है, क्योंकि जब मैं पुनर्निर्देशित नहीं होता मैं इसे ब्राउज़र में आज़माता हूं .. लेकिन संकेत के लिए धन्यवाद। – user1069624

+0

Muse द्वारा सुझाए गए त्रुटि स्ट्रीम से और त्रुटि विवरण पढ़ने से पहले। यदि यह केवल एक अन्य संभावना से पुनर्निर्देशित नहीं है, तो मैं सोच सकता हूं कि सर्वर आपके अनुरोध में कुछ और (कुकी, अन्य प्रकार के शीर्षलेख) की अपेक्षा कर रहा है। मैं सफल अनुरोध में आपके ब्राउज़र द्वारा पारित सभी शीर्षकों की प्रतिलिपि बनाउंगा (इसके परिणामस्वरूप सफल HttpURLConnection कॉल होना चाहिए) और एक बार में एक शीर्षलेख को पीछे हटाना मेरे काम से काम करना होगा। –

+0

ठीक है मुझे लगता है कि मुझे पता है कि क्या गलत है .. पृष्ठ वास्तव में नीचे है लेकिन ब्राउज़र से मुझे लगता है कि यह कैश संस्करण प्राप्त करने के लिए उपयोग किया जाता है .. क्या यह हो सकता है? क्योंकि वह पृष्ठ बिल्कुल काम नहीं कर रहा है .. लेकिन जब मैं एक ही मेजबान के तहत एक और पेज आज़माता हूं .. यह काम करता है! – user1069624

7

यह ज्यादातर एन्कोडिंग के कारण हो रहा है। यदि आप ब्राउज़र का उपयोग कर रहे हैं, लेकिन आपके प्रोग्राम में 500 (आंतरिक सर्वर त्रुटि) प्राप्त करना, ऐसा इसलिए है क्योंकि ब्राउज़र में वर्णमाला और सामग्री-प्रकारों के संबंध में अत्यधिक परिष्कृत कोड होता है।

यहां मेरा कोड है और यह ISO8859_1 के मामले में वर्णमाला और अंग्रेजी भाषा के रूप में काम करता है।

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(); 

} 

और मुख्य कार्यक्रम में, इस तरह इसे कहते:

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

मैं "की समस्या यूआरएल ब्राउज़र में काम करता में भाग है, लेकिन जब मैं करता हूँ http-मिल जावा में मैं एक 500 मिलता है त्रुटि "।

मेरे मामले में समस्या यह है कि सामान्य http-मिल /default.aspx के बीच एक अनंत रीडायरेक्ट लूप में समाप्त हो गया था और /login.aspx

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

क्या हो रहा था था: सर्वर में कार्य करता है एक तीन-भाग कुकी और con.getResponseCode() केवल भागों में से एक का उपयोग किया जाता है। शीर्षक में कुकी डेटा इस तरह देखा:

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 
... 

तो आवश्यक डेटा भ्रमित कर ली का केवल एक तिहाई प्राप्त जब सर्वर: आप में लॉग इन कर रहे हैं! कोई इंतजार नहीं, आपको लॉगिन करना होगा। नहीं, आप लॉग इन हैं, ...

असीमित रीडायरेक्ट-लूप के आसपास काम करने के लिए मुझे मैन्युअल रूप से फिर से निर्देशों की तलाश करना पड़ा और मैन्युअल रूप से "सेट-कुकी" प्रविष्टियों के लिए शीर्षलेख को पार्स करना पड़ा।

  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(); 

इस कोड के साथ कुकी के पार्स, अगर हम प्रतिक्रिया कोड में कोई रीडायरेक्ट मिलती है:

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

मेरे मामले में यह पता चला कि सर्वर हमेशा HTTP/1.1 500 (ब्राउज़र में देता जैसा कि जावा में) पृष्ठ के लिए मैं एक्सेस करना चाहता था, लेकिन फिर भी वेबपृष्ठ सामग्री को सफलतापूर्वक वितरित करता था।

ब्राउज़र के माध्यम से विशिष्ट पृष्ठ तक पहुंचने वाला एक इंसान ध्यान नहीं देता है, क्योंकि वह जावा में पृष्ठ और कोई त्रुटि संदेश नहीं देखेगा, मुझे इनपुट स्ट्रीम (धन्यवाद @Muse) के बजाय त्रुटि स्ट्रीम पढ़नी पड़ी।

मुझे नहीं पता कि क्यों, हालांकि। क्रॉलर्स को बाहर रखने के लिए कुछ अस्पष्ट तरीका हो सकता है।

0

यह एक पुराना सवाल है, लेकिन मेरे पास एक ही समस्या है और इसे हल किया गया है।

यह अन्य समान स्थिति में मदद कर सकता है।

मेरे मामले में मैं स्थानीय पर्यावरण पर सिस्टम विकसित कर रहा था, और जब मैंने ब्राउज़र से अपने रेस्ट एपी की जांच की तो हर चीज ठीक काम करती थी लेकिन मुझे अपने एंड्रॉइड सिस्टम में हर समय HTTP त्रुटि 500 ​​फेंक दिया गया।

समस्या तब होती है जब आप एंड्रॉइड पर काम करते हैं, यह वीएम (वर्चुअल मशीन) पर काम करता है, जिसका कहना है कि इसका मतलब है कि आपका स्थानीय कंप्यूटर फ़ायरवॉल आपकी वर्चुअल मशीन को स्थानीय यूआरएल (आईपी) पते तक पहुंचने से रोक सकता है।

आपको बस अपने कंप्यूटर फ़ायरवॉल में अनुमति देने की आवश्यकता है। यदि आप अपने नेटवर्क से बाहर सिस्टम तक पहुंचने का प्रयास कर रहे हैं तो वही बात लागू होती है।

0

मुझे एक ही समस्या का सामना करना पड़ा, और हमारी समस्या पैरामीटर मानों में से एक में एक विशेष प्रतीक था। हमने इसे URLEncoder.encode(String, String)

संबंधित मुद्दे