终于又考完一门试,开始做课程设计了,结果课程设计给工作室一个尾气3个月的项目,而这次的先用我写的贴吧放上去,我变得暂时空闲了,开始着手写校内开心农场小工具- 全能拖拉机。 首先要解决的就是校内登录的问题,那就是Get/Post方法了,还有用户状态保存,就是session的操作。Java不同于C#,那位可以集成系统 的浏览器或者之间创建一个Browser。
开始写了自己的第一个版本。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.net.HttpURLConnection;
public class FarmerHelper {
/**
* @param args
* @throws ProtocolException
*/
public static void main(String[] args) throws ProtocolException {
String loginUrlStr = "http://login.xiaonei.com/Login.do";
String homeUrlStr = "http://home.xiaonei.com/Home.do";
URL loginUrl = null;
URL homeUrl = null;
HttpURLConnection loginConn = null;
HttpURLConnection homeConn = null;
try {
loginUrl = new URL(loginUrlStr);
homeUrl = new URL(homeUrlStr);
try {
loginConn = (HttpURLConnection) loginUrl.openConnection();
homeConn = (HttpURLConnection) homeUrl.openConnection();
} catch (IOException e) {
print("Conn't open the url connection!");
e.printStackTrace();
}
} catch (MalformedURLException e) {
print("Illegal URL!");
e.printStackTrace();
return;
}
loginConn.setRequestMethod("POST");
loginConn.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.10)"
+ " Gecko/2009042316 Firefox/3.0.10");
loginConn.setRequestProperty("Keep-Alive", "300");
loginConn.setRequestProperty("Connection", "keep-alive");
loginConn.setRequestProperty("email", "alswlwangzi@163.com");
loginConn.setRequestProperty("password", "xh77Gffb_i");
loginConn.setRequestProperty("submit", "登录");
loginConn.setRequestProperty("Keep-Alive", "300");
try {
loginConn.connect();
String headerName = null;
String cookie = "";
/*
* for (int i=0; (headerName =
* loginConn.getHeaderFieldKey(i))!=null; i++) { if
* (headerName.equals("Set-Cookie")) { cookie =
* loginConn.getHeaderField(i); print(cookie); } }
*/
cookie = loginConn.getHeaderField("Set-Cookie");
print(cookie);
homeConn.setRequestProperty("Cookie", cookie);
homeConn.setRequestMethod("GET");
homeConn.connect();
BufferedReader in = new BufferedReader(new InputStreamReader(
homeConn.getInputStream()));
String lineStr = null;
while ((lineStr = in.readLine()) != null) {
// print(lineStr);
print(new String(lineStr.getBytes("GBK"), "UTF-8"));
}
} catch (IOException e) {
print("conn't connect to the server!");
e.printStackTrace();
}
}
private static void print(Object o) {
System.out.println(o);
}
}
想法总是好的,现实总是残酷的,调试很久,用WireShark抓包,都是有Length Required错误,这个比较头疼,我感觉是我session传递的问题(其实不是,后来发现是Post的格式问题),于是网上找来一个Session操作类。
猛击这里下载cookiemanager 同时你可以参考这个类作者的文章 猛击这里打开HOW-TO: Handling cookies using the java.net.* API,谢谢这位外国朋友的帮助。 可惜尽管有这个外国朋友帮助,我写了第二个版本,仍然遇到了相同问题,Length Required… 崩溃了,开始查找网络编程书,同时参考WireShark的抓包,我惊讶的发现,我把数据域写到了Headers里面去了。 这个致命性的错误导致服务器不能找到正确的数据,并且没有提供数据域的大小Content-Length,所以导致服务器报错。 最后再借花献佛,送上一个完整操作Http GET/POST的类猛击这里下载httprequestproxy依然感谢原作者,
猛击这里打开原文链接友情提示一下,这个类是07年写的,里面有一些注释说明在1.4和1.5下几个参数不一样,我没有亲测,建议使用1.5 的设置 嗯,有这两个类,明天工作应该会轻松一些,继续fighting!
原文链接: java.net.*操作session/GET/POST方法 | Log4D
3a1ff193cee606bd1e2ea554a16353ee
欢迎关注我的微信公众号:窥豹