2013-02-27 168 views
6

मैं एक बीन में निम्नलिखित जावा कोड का उपयोग URL के सामग्री पढ़ने के लिए:जावा: पुनर्निर्देशित यूआरएल से सामग्री कैसे पढ़ा जाए?

String url; 
String inputLine; 
StringBuilder srcCode=new StringBuilder(); 

public void setUrl (String value) { 
    url = value; 
} 

private void scanWebPage() throws IOException { 
    try { 
     URL dest = new URL(url); 
     URLConnection yc = dest.openConnection(); 
     yc.setUseCaches(false); 
     BufferedReader in = new BufferedReader(new 
         InputStreamReader(yc.getInputStream())); 
     while ((inputLine = in.readLine()) != null) 
      srcCode = srcCode.append (inputLine); 
     in.close(); 
    } catch (FileNotFoundException fne) { 
     srcCode.append("File Not Found") ; 
    } 
} 

कोड सबसे यूआरएल के लिए ठीक काम करता है, लेकिन रीडायरेक्ट किए गए URL के लिए काम नहीं करता। रीडायरेक्ट यूआरएल से सामग्री पढ़ने के लिए मैं उपर्युक्त कोड कैसे अपडेट कर सकता हूं? पुनर्निर्देशित यूआरएल के लिए, मुझे "File Not Found" मिलता है। ऊपर अपने कोड में

HttpURLConnection yc = (HttpURLConnection) dest.openConnection(); 
    yc.setInstanceFollowRedirects(true); 

संदर्भ में:

+0

'java.net.URL' डिफ़ॉल्ट रूप से रीडायरेक्ट का पालन करना चाहिए (जब तक आप पहले से' बुलाया गया है HttpURLConnection.setFollowRedirects (झूठा) '), तो आपको केवल अंतिम लक्ष्य यूआरएल की सामग्री देखना चाहिए। यह मानते हुए कि रीडायरेक्ट स्वयं 404 पेज पर नहीं जाता है ... –

+2

प्रोटोकॉल में परिवर्तन होने पर यूआरएल कनेक्शन रीडायरेक्ट का पालन नहीं करेगा (यानी, HTTP से HTTPS तक)। क्या यह आपका परिदृश्य है? साथ ही, क्या आपको [अपाचे एचटीपी कॉम्पोनेंट्स] (http://hc.apache.org/) का उपयोग करने की अनुमति नहीं है? – Perception

उत्तर

4

निम्नलिखित एक जाना दे

`String url = "http://java.sun.com"; 
    String inputLine; 
    StringBuilder srcCode=new StringBuilder(); 



    URL dest = new URL(url); 
    HttpURLConnection yc = (HttpURLConnection) dest.openConnection(); 
    yc.setInstanceFollowRedirects(true); 
    yc.setUseCaches(false); 

    BufferedReader in = new BufferedReader(
     new InputStreamReader(
      yc.getInputStream())); 
    while ((inputLine = in.readLine()) != null) { 
     srcCode = srcCode.append (inputLine); 
    } 

    in.close();` 

आगे संशोधित आप का निदान क्या चल रहा है मदद करने के लिए। यह कोड ऑटो रीडायरेक्शन बंद कर देता है और उसके बाद मैन्युअल रूप से स्थान हेडर प्रिंटिंग का पालन करता है जैसे यह साथ जाता है।

@Test 
public void f() throws IOException { 
    String url = "http://java.sun.com"; 


    fetchURL(url); 
} 


private HttpURLConnection fetchURL(String url) throws IOException { 
    URL dest = new URL(url); 
    HttpURLConnection yc = (HttpURLConnection) dest.openConnection(); 
    yc.setInstanceFollowRedirects(false); 
    yc.setUseCaches(false); 

    System.out.println("url = " + url); 

    int responseCode = yc.getResponseCode(); 
    if (responseCode >= 300 && responseCode < 400) { // brute force check, far too wide 
     return fetchURL(yc.getHeaderField("Location")); 
    } 

    System.out.println("yc.getResponseCode() = " + yc.getResponseCode()); 

    return yc; 
} 
+1

क्रिस - धन्यवाद, लेकिन यह काम नहीं किया। पुनर्निर्देशित यूआरएल "मिनी यूआरएल" की तरह हैं जो वेब ब्राउज़र में दर्ज होने पर एक वास्तविक यूआरएल में बदल जाते हैं, लेकिन जावा कोड के माध्यम से, वे नहीं बदलते हैं और उन्हें अवैध यूआरएल कहा जाता है। – user1492667

+0

यूआरएल क्या है जो आप जा रहे हैं? मैंने उपरोक्त कोड का परीक्षण किया और पाया कि यह उपरोक्त यूआरएल के लिए रीडायरेक्ट का पालन करता है। आपके मामले में आपका यूआरएल एक अलग प्रोटोकॉल पर रीडायरेक्ट कर रहा है? यदि ऐसा है तो शायद यह आपकी समस्या है क्योंकि HttpURLConnection उन का पालन नहीं करेगा। यदि ऐसा है तो मैं व्यक्तिगत रूप से लाइब्रेरी का उपयोग करता हूं जैसे कि Play2, या Apache HttpCommons में शामिल एक। वैकल्पिक रूप से आप हमेशा ऑटो फॉलो को गलत पर सेट कर सकते हैं और फिर स्थान शीर्षलेख को स्वयं पढ़ सकते हैं और फिर उस URL को स्पष्ट रूप से स्वयं प्राप्त कर सकते हैं। –

0

अपने अपने prog की नहीं debuggin, लेकिन आप विचार कर सकते हैं यह एक

public class GetURLData 
{ 
    public static void main(String args[]) 
    { 
     String url = "the url you want the response from"; 
     HttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 
      HttpResponse response; 
      StringBuilder builder= new StringBuilder(); 
      try 
      { 
       response = httpClient.execute(httpPost); 
       BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
       char[] buf = new char[8000]; 
       int l = 0; 
        while (l >= 0) 
        { 
         builder.append(buf, 0, l); 
         l = in.read(buf); 
        } 
       System.out.println(builder.toString); 
      } catch (Exception e) 
     { 
       System.out.println("Exception is :"+e); 
       e.printStackTrace(); 
      } 
    } 
} 

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

  • कोई संबंधित समस्या नहीं^_^