如何在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实现相同的会话,任何这样的例子?
我建议使用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,但我并不在你的代码看不到任何设置为提供搜索参数,如搜索表单所示。
我的建议是,你试图检查你的客户端请求一个不同的页面,你可以证明这是生成的。
页面不需要发布表单提交后,我只是浏览器http: //www.hkprinters.org/en/member_search.asp?page=1&mode=view,就会显示正确的搜寻结果。我有一个新的发现,我会更新这个问题 – 2012-08-15 14:25:27
写完之后,如果您需要写任何内容,似乎有些可疑,但是在阅读任何内容之前,如果您确实需要阅读任何内容(可能也是可疑的),请调用HttpURLConnection.getResponseCode()。如果您只是执行I/O操作,则可能会将某些HTTP状态代码映射到IOExceptions。
您希望得到哪种反应?您实际得到哪种反应? – Tedil 2012-08-14 16:02:54
尝试用'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
它给出了空白的响应或抛出异常? – 2012-08-14 16:16:12