打造正方管理系统Android客户端(二)

前一篇教程中,我们学习了如何在手机上请求登录正方管理系统,那么我们登录成功之后,就可以执行其他的操作了。本文给大家介绍的是如何查询成绩;
以及用Jsoup解析html网页。
有人问为什么不用原生的Okhttp或者Retrofit,因为我觉得做这个东西的都是小白,刚学安卓不就,先用用简单封装好的框架也未尝不可,是吧?

首先需要添加Jsoup依赖

compile ‘org.jsoup:jsoup:1.9.1’

然后我们开始吧

######抓包查看请求数据
首先进入成绩查询页面,可以看到想要查成绩,需要选择学年,学期,以及查询方式,我们先试着查询一下成绩,并用chrome开发者工具抓包。

成绩查询页面
通过抓包可以得到请求的表单信息;

表单
其中前面两个不用管,直接复制就可以,这里要注意的,查询方式不一样,第一个值是不一样的,所以一定要区别开来,查询方式指的是:按学期查询,按学年查询…还有就是txtQSCJ,txtZZCJ这两个值也是不变的,可能不同的学校这个值也不一样。ddlXN这个是学年,ddlXQ学期,看最后一个Button1,这个值是什么呢?直接复制就好!哈哈。

######获得参数
不过这里我们还有一个步骤需要做;先看看Request Url

http://210.44.159.4/xscj.aspxxh=201311011011&xm=%BA%FA%BA%E9%D4%B4&gnmkdm=N121605

我们可以看到url里面包含xh学号,还有xm,其中姓名是中文姓名url编码,所以,这个url我们是需要拼接出来的。怎么对中文进行url编码呢,这个就简单了,有java api帮助我们;

1
2
3
4
5
6
7
8
public static String encoding(String text) {
try {
text = URLEncoder.encode(text, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return text;
}

这样,我们需要的就都有了。那就开始查询吧;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
final PostFormBuilder post = OkHttpUtils.post();

post.url(cjcxUrl)
.addHeader("Host", "210.44.159.4")
.addHeader("Referer", cjcxUrl)
.addParams("__VIEWSTATE", VIEWSTATE)
.addParams("__VIEWSTATEGENERATOR", "8963BEEC")
.addParams("ddlXN", ddlXN)
.addParams("ddlXQ", ddlXQ)
.addParams("txtQSCJ", "0")
.addParams("txtZZCJ", "100")
.addParams("Button1", "%B0%B4%D1%A7%C6%DA%B2%E9%D1%AF")
.build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e) {
Toast.makeText(mContext, "查询失败", Toast.LENGTH_SHORT).show();
}

@Override
public void onResponse(String response) {
//查询成功
});

查询成功之后呢,我们获得了这个页面的源代码

成绩

#######解析成绩
想要解析html网页得到成绩数据,就需要Jsoup的帮助了。
我们现在电脑上看一下它的源代码是什么样的。

成绩表格
我们可以看到,所有的成绩,都放在一个id为DataGrid1的表格中的<tbody>标签中,并且每一个<tr>里面都包含着一个课程的信息,每个信息又都在<td>中,这样我们的思路就屡清楚了;就可以使用Jsoup来帮助我们解析了。关于Jsoup的使用可以参考这篇文章,Jsoup库使用完全解析,本文不做研究。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public static List<ScoreBean> parseScore(String reponse) {
List<ScoreBean> scoreList = new ArrayList<>();
Document document = Jsoup.parse(response);
Element dataGrid1 = document.getElementById("DataGrid1");
Elements trs = dataGrid1.select("tbody").select("tr");
for (int i = 0; i < trs.size(); i++) {
ScoreBean bean = new ScoreBean();
Elements tds = trs.get(i).select("td");
for (int j = 0; j < tds.size(); j++) {
switch (j) {
case 0:
bean.setCourseId(tds.get(j).text());
break;
case 1:
bean.setCourseName(tds.get(j).text());
break;
case 2:
bean.setCourseXz(tds.get(j).text());
break;
case 3:
bean.setCourseCj(tds.get(j).text());
break;
case 4:
bean.setCourseGs(tds.get(j).text());
break;
case 5:
bean.setCourseBk(tds.get(j).text());
break;
case 6:
bean.setCourseCx(tds.get(j).text());
break;
case 7:
bean.setCourseXf(tds.get(j).text());
break;
case 8:
bean.setCourseBj(tds.get(j).text());
break;
}
}
scoreList.add(bean);
}
return scoreList;
}

ScoreBean可以根据你的需要选择需要的属性,我这里贴一份完整的;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
public class ScoreBean {
private String courseId;
private String courseName;
private String courseXz;
private String courseCj;
private String courseGs;
private String courseBk;
private String courseCx;
private String courseXf;
private String courseBj;

public String getCourseBj() {
return courseBj;
}

public void setCourseBj(String courseBj) {
this.courseBj = courseBj;
}

public String getCourseBk() {
return courseBk;
}

public void setCourseBk(String courseBk) {
this.courseBk = courseBk;
}

public String getCourseCj() {
return courseCj;
}

public void setCourseCj(String courseCj) {
this.courseCj = courseCj;
}

public String getCourseCx() {
return courseCx;
}

public void setCourseCx(String courseCx) {
this.courseCx = courseCx;
}

public String getCourseGs() {
return courseGs;
}

public void setCourseGs(String courseGs) {
this.courseGs = courseGs;
}

public String getCourseId() {
return courseId;
}

public void setCourseId(String courseId) {
this.courseId = courseId;
}

public String getCourseName() {
return courseName;
}

public void setCourseName(String courseName) {
this.courseName = courseName;
}

public String getCourseXf() {
return courseXf;
}

public void setCourseXf(String courseXf) {
this.courseXf = courseXf;
}

public String getCourseXz() {
return courseXz;
}

public void setCourseXz(String courseXz) {
this.courseXz = courseXz;
}
}

这样我们的所有成绩信息就都保存在了List中了,然后就可以利用ListView或者RecylerView展示在页面上了;
交给你吧

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章