如何在JAVA中获得正确的HTTP响应?

问题描述:

我想在一个网页得到一些数据,所以我用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

我建议使用Apache http client.
您将有更好的控制你使用的HTTP方法(GET,PUT,等...)
该HTTP客户端被广泛使用。
你必须处理的响应更好的API(有可能与当然的URLConnection的,但这个框架简化了操作。

尝试使用java.net.HttpURLConnection中,而不是URLConnection的。

如果没有发送请求中的任何然后注释以下行:

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

我检查了所提供的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

写完之后,如果您需要写任何内容,似乎有些可疑,但是在阅读任何内容之前,如果您确实需要阅读任何内容(可能也是可疑的),请调用HttpURLConnection.getResponseCode()。如果您只是执行I/O操作,则可能会将某些HTTP状态代码映射到IOExceptions。