2012-08-14 73 views
0

我想在一個網頁得到一些數據,所以我用Java來發送一個HTTP請求到服務器如何在JAVA中獲得正確的HTTP響應?

我已經試過的URLConnection和Jsoup,但他們都不能得到正確的響應

如果瀏覽網址在瀏覽器

http://www.hkprinters.org/en/member_search.asp?page=1&mode=view

的反應是正確的,得到

的搜索結果,但使用Java,我只能得到搜索,沒有結果。

爲什麼響應不正確以及如何得到正確的響應?

import java.io.*; 
import java.util.*; 
import java.net.*; 
import org.json.*; 

class HttpRequest 
{ 
    public static void main(String[] args) throws Exception 
    { 
     URL url = new URL("http://www.hkprinters.org/en/member_search.asp?page=1&mode=view"); 
     URLConnection conn = url.openConnection(); 
     conn.setDoOutput(true); 
     OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
     wr.flush(); 

     BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("station.txt"))); 

     String line; 
     while((line=rd.readLine())!=null) 
     { 
      out.write(line); 
     } 
     out.close(); 
    } 


} 






import org.jsoup.nodes.Document; 
import org.jsoup.select.Elements; 
import org.jsoup.*; 

public class read_line2 { 

    public static void main(String args[]) { 
     try { 
      Document doc = Jsoup.connect("http://www.hkprinters.org/en/member_search.asp?page=1&mode=view").get(); 
      Document doc = Jsoup.parse(input, null); 
      Elements newHeadlines = doc.select("*"); 
      System.out.println(newHeadlines); 

     } catch (Exception e) { 
     } 
    } 
} 

更新:

我想先解釋一下正確的和不正確的結果。

正確的是搜索表單+搜索結果數據(如公司名稱,地址,電話),我想要這些數據。

不正確的是:

<title>db</title> 
<title>func</title> 
<!DOCTYPE HTML PUBLIC 
........ 
<input type="hidden" name="hdnMode" value="search"/></form> 
</table> 
<font size="2"><br/> 

,如果你使用的瀏覽器,看看,你只能看到搜索形式,沒有結果。

新的發現是:我現在可以使用瀏覽器來獲取不正確的結果。如果你關閉瀏覽器,然後重新打開,然後瀏覽http://www.hkprinters.org/en/member_search.asp?page=1&mode=view

那麼你會得到不正確的結果,而這個結果是完全一樣,以JAVA結果

<title>db</title> 
<title>func</title> 
<!DOCTYPE HTML PUBLIC 
........ 
<input type="hidden" name="hdnMode" value="search"/></form> 
</table> 
<font size="2"><br/> 

現在,如果你可以點擊提交(不需要輸入什麼),然後搜索結果再次顯示,現在即使你只瀏覽了http://www.hkprinters.org/en/member_search.asp?page=1&mode=view(get方法),搜索結果仍顯示出來。

所以我想這個頁面保存發佈數據到會話時,我第一次點擊提交按鈕,之後,每次我瀏覽這個頁面時,它會從會話中找到搜索鍵,所以即使我使用get方法發送頁面和模式,它仍然給我的搜索結果。

但我不知道如何使用JAVA實現相同的會話,任何這樣的例子?

+0

您希望得到哪種反應?您實際得到哪種反應? – Tedil 2012-08-14 16:02:54

+1

嘗試用'conn.setRequestProperty(「User-Agent」,「Mozilla/5.0(Macintosh; U;英特爾Mac OS X 10.4; en-US; rv:1.9.2.2)Gecko/20100316 Firefox/3.6.2" )'。 asp頁面可能在用戶代理字符串或cookie上。 – ZnArK 2012-08-14 16:05:27

+0

它給出了空白的響應或拋出異常? – 2012-08-14 16:16:12

回答

1

我建議使用Apache http client.
您將有更好的控制你使用的HTTP方法(GET,PUT,等...)
該HTTP客戶端被廣泛使用。
你必須處理的響應更好的API(有可能與當然的URLConnection的,但這個框架簡化了操作。

1

嘗試使用java.net.HttpURLConnection中,而不是URLConnection的。

2

如果沒有發送請求中的任何然後註釋以下行:

conn.setDoOutput(true); 
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
wr.flush(); 
1

我檢查了所提供的URL的源代碼。它在HTML標記中有一些錯誤。它可以在一些瀏覽器中表達一個表單不被submmited的原因。這取決於你的瀏覽器是如何寬容的壞標記。例如該元素/ TR和TR元素之間定義,它是指一個表內:

... 
</tr> 
<form action="member_search.asp" method="post" name="frmSearch" 
    onSubmit="return checkSearchForm();"> 
<tr class="copy"> 
... 

我還可以看到用於提交方法是POST,但我並不在你的代碼看不到任何設置爲提供搜索參數,如搜索表單所示。

我的建議是,你試圖檢查你的客戶端請求一個不同的頁面,你可以證明這是生成的。

+0

頁面不需要發佈表單提交後,我只是瀏覽器http: //www.hkprinters.org/en/member_search.asp?page=1&mode=view,就會顯示正確的搜尋結果。我有一個新的發現,我會更新這個問題 – 2012-08-15 14:25:27

0

寫完之後,如果您需要寫任何內容,似乎有些可疑,但是在閱讀任何內容之前,如果您確實需要閱讀任何內容(可能也是可疑的),請調用HttpURLConnection.getResponseCode()。如果您只是執行I/O操作,則可能會將某些HTTP狀態代碼映射到IOExceptions。

相關問題