更新太多了,主要是代码结构的一些调整,一方面是service包下只保留请求部分,解析由调用方自行调用(因为存在部分只需要请求而不需要解析的情况),将本科教学系统的功能api拆分成不同的类,调用者可按需生成实例,api接口异常改用通用的业务异常
parent
3bc1df9836
commit
f3aa0d4be0
@ -1,38 +1,105 @@ |
|||||||
package cn.linghang.mywust.core.exception; |
package cn.linghang.mywust.core.exception; |
||||||
|
|
||||||
public class ApiException extends BasicException { |
public class ApiException extends BasicException { |
||||||
private final int code; |
private final Code code; |
||||||
|
|
||||||
public ApiException(int code) { |
public ApiException(Code code) { |
||||||
this.code = code; |
this.code = code; |
||||||
} |
} |
||||||
|
|
||||||
public ApiException(int code, String message) { |
public ApiException(Code code, String message) { |
||||||
super(message); |
super(message); |
||||||
this.code = code; |
this.code = code; |
||||||
} |
} |
||||||
|
|
||||||
public int getCode() { |
public Code getCode() { |
||||||
return code; |
return code; |
||||||
} |
} |
||||||
|
|
||||||
|
public int getCodeValue() { |
||||||
|
return code.value; |
||||||
|
} |
||||||
|
|
||||||
|
public String getCodeDescribe() { |
||||||
|
return code.describe; |
||||||
|
} |
||||||
|
|
||||||
@Override |
@Override |
||||||
public String toString() { |
public String toString() { |
||||||
return "接口调用异常: " + code; |
return "接口调用异常: " + code; |
||||||
} |
} |
||||||
|
|
||||||
public static class ApiExceptionCode { |
public enum Code { |
||||||
// 统一认证的异常
|
/** |
||||||
public static final int UNI_LOGIN_PASSWORD_WRONG = 100101; |
* 未知的API异常 |
||||||
public static final int UNI_LOGIN_USER_NOT_EXISTS = 100102; |
*/ |
||||||
public static final int UNI_LOGIN_USER_BANNED = 100103; |
UNKNOWN_EXCEPTION(-1, "未知错误(开发又有活干啦)"), |
||||||
|
|
||||||
|
// --------------------------------
|
||||||
|
// 统一认证的异常(本科生、图书馆)
|
||||||
|
|
||||||
|
/** |
||||||
|
* 密码错误 |
||||||
|
*/ |
||||||
|
UNI_LOGIN_PASSWORD_WRONG(100100, "统一认证登录: 密码错误"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 用户不存在 |
||||||
|
*/ |
||||||
|
UNI_LOGIN_USER_NOT_EXISTS(100101, "统一认证登录: 用户不存在"), |
||||||
|
|
||||||
|
/** |
||||||
|
* 用户登录被封禁 |
||||||
|
*/ |
||||||
|
UNI_LOGIN_USER_BANNED(100102, "统一认证登录: 用户被封禁"), |
||||||
|
|
||||||
|
// --------------------------------
|
||||||
// 共有异常码:cookie无效
|
// 共有异常码:cookie无效
|
||||||
// 放一起了
|
|
||||||
public static final int BKJX_COOKIE_INVALID = 110101; |
/** |
||||||
public static final int LIBRARY_COOKIE_INVALID = 12101; |
* Cookie无效 |
||||||
public static final int PHYSICS_COOKIE_INVALID = 130101; |
*/ |
||||||
public static final int GRADE_COOKIE_INVALID = 140101; |
COOKIE_INVALID(100101, "Cookie无效"), |
||||||
|
|
||||||
|
// --------------------------------
|
||||||
|
// 本科生API异常代码
|
||||||
|
|
||||||
|
/** |
||||||
|
* 需要评教 |
||||||
|
*/ |
||||||
|
BKJX_COURSE_NEED_EVALUATE(110102, "需要评教"), |
||||||
|
|
||||||
|
// --------------------------------
|
||||||
|
// 物理实验系统API异常代码
|
||||||
|
|
||||||
|
/** |
||||||
|
* 物理实验系统密码错误 |
||||||
|
*/ |
||||||
|
PHYSICS_PASSWORD_WRONG(130100, "物理实验系统登录: 密码错误"), |
||||||
|
|
||||||
|
// --------------------------------
|
||||||
|
// 研究生API异常代码
|
||||||
|
|
||||||
|
/** |
||||||
|
* 研究生密码错误 |
||||||
|
*/ |
||||||
|
GRADUATE_PASSWORD_WRONG(140100, "研究生登录: 密码错误"), |
||||||
|
; |
||||||
|
|
||||||
|
// --------------------------------
|
||||||
|
// 图书馆API异常代码
|
||||||
|
|
||||||
|
private final int value; |
||||||
|
private final String describe; |
||||||
|
|
||||||
|
Code(int value, String describe) { |
||||||
|
this.value = value; |
||||||
|
this.describe = describe; |
||||||
} |
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() { |
||||||
|
return String.format("%s(%d)", describe, value); |
||||||
|
} |
||||||
|
} |
||||||
} |
} |
@ -1,14 +0,0 @@ |
|||||||
package cn.linghang.mywust.core.exception; |
|
||||||
|
|
||||||
public class CookieInvalidException extends BasicException { |
|
||||||
public CookieInvalidException() { |
|
||||||
} |
|
||||||
|
|
||||||
public CookieInvalidException(String message) { |
|
||||||
super(message); |
|
||||||
} |
|
||||||
|
|
||||||
public CookieInvalidException(String message, Throwable cause) { |
|
||||||
super(message, cause); |
|
||||||
} |
|
||||||
} |
|
@ -1,14 +0,0 @@ |
|||||||
package cn.linghang.mywust.core.exception; |
|
||||||
|
|
||||||
public class PasswordWornException extends BasicException { |
|
||||||
public PasswordWornException() { |
|
||||||
} |
|
||||||
|
|
||||||
public PasswordWornException(String message) { |
|
||||||
super(message); |
|
||||||
} |
|
||||||
|
|
||||||
public PasswordWornException(String message, Throwable cause) { |
|
||||||
super(message, cause); |
|
||||||
} |
|
||||||
} |
|
@ -1,4 +1,4 @@ |
|||||||
package cn.linghang.mywust.core.parser.postgraduate; |
package cn.linghang.mywust.core.parser.graduate; |
||||||
|
|
||||||
import cn.linghang.mywust.core.exception.ParseException; |
import cn.linghang.mywust.core.exception.ParseException; |
||||||
import cn.linghang.mywust.core.parser.Parser; |
import cn.linghang.mywust.core.parser.Parser; |
@ -1,4 +1,4 @@ |
|||||||
package cn.linghang.mywust.core.parser.postgraduate; |
package cn.linghang.mywust.core.parser.graduate; |
||||||
|
|
||||||
import cn.linghang.mywust.core.exception.ParseException; |
import cn.linghang.mywust.core.exception.ParseException; |
||||||
import cn.linghang.mywust.core.parser.Parser; |
import cn.linghang.mywust.core.parser.Parser; |
@ -1,4 +1,4 @@ |
|||||||
package cn.linghang.mywust.core.parser.postgraduate; |
package cn.linghang.mywust.core.parser.graduate; |
||||||
|
|
||||||
import cn.linghang.mywust.core.exception.ParseException; |
import cn.linghang.mywust.core.exception.ParseException; |
||||||
import cn.linghang.mywust.core.parser.Parser; |
import cn.linghang.mywust.core.parser.Parser; |
@ -1,4 +1,4 @@ |
|||||||
package cn.linghang.mywust.core.parser.postgraduate; |
package cn.linghang.mywust.core.parser.graduate; |
||||||
|
|
||||||
import cn.linghang.mywust.core.exception.ParseException; |
import cn.linghang.mywust.core.exception.ParseException; |
||||||
import cn.linghang.mywust.core.parser.Parser; |
import cn.linghang.mywust.core.parser.Parser; |
@ -1,13 +0,0 @@ |
|||||||
package cn.linghang.mywust.core.parser.physics.xpath; |
|
||||||
|
|
||||||
public class PhysicsCourseXpath { |
|
||||||
/** |
|
||||||
* 用于获取表格中所有行的xpath |
|
||||||
* */ |
|
||||||
public static final String COURSE_ROWS_XPATH = "//*[@id=\"ID_PEE110301_gvpee120101\"]/tbody/tr"; |
|
||||||
|
|
||||||
public static final String COURSE_ROW_NAME_XPATH = ""; |
|
||||||
public static final String COURSE_ROW_TEACHER_XPATH = ""; |
|
||||||
public static final String COURSE_ROW_TIME_XPATH = ""; |
|
||||||
public static final String COURSE_ROW_CLASSROOM_XPATH = ""; |
|
||||||
} |
|
@ -1,5 +0,0 @@ |
|||||||
package cn.linghang.mywust.core.parser.physics.xpath; |
|
||||||
|
|
||||||
public class PhysicsIndexXpath { |
|
||||||
public static final String PHYSICS_LINK_XPATH = "//*[@id=\"rolemenu\"]/tbody/tr[1]/td[1]/a[2]"; |
|
||||||
} |
|
@ -1,5 +0,0 @@ |
|||||||
package cn.linghang.mywust.core.parser.undergraduate.xpath; |
|
||||||
|
|
||||||
public class ExamInfoXpath { |
|
||||||
public static final String EXAM_INFO_ROWS_XPATH = "//*[@id=\"dataList\"]/tbody/tr"; |
|
||||||
} |
|
@ -1,31 +0,0 @@ |
|||||||
package cn.linghang.mywust.core.parser.undergraduate.xpath; |
|
||||||
|
|
||||||
/** |
|
||||||
* <p>本科生学生信息接口用到的xpath</p> |
|
||||||
* <p>看着挺唬人的,其实直接浏览器选择元素复制xpath就行了</p> |
|
||||||
* <p>这里的xpath只要网站UI不整什么花活就不会出问题</p> |
|
||||||
* |
|
||||||
* @author lensfrex |
|
||||||
* @create 2022-10-22 22:16 |
|
||||||
*/ |
|
||||||
public class StudentInfoXpath { |
|
||||||
public static final String STUDENT_NUMBER = "//*[@id=\"xjkpTable\"]/tbody/tr[3]/td[5]"; |
|
||||||
|
|
||||||
public static final String COLLEGE = "//*[@id=\"xjkpTable\"]/tbody/tr[3]/td[1]"; |
|
||||||
|
|
||||||
public static final String MAJOR = "//*[@id=\"xjkpTable\"]/tbody/tr[3]/td[2]"; |
|
||||||
|
|
||||||
public static final String CLASS = "//*[@id=\"xjkpTable\"]/tbody/tr[3]/td[4]"; |
|
||||||
|
|
||||||
public static final String NAME = "//*[@id=\"xjkpTable\"]/tbody/tr[4]/td[2]"; |
|
||||||
|
|
||||||
public static final String SEX = "//*[@id=\"xjkpTable\"]/tbody/tr[4]/td[4]"; |
|
||||||
|
|
||||||
public static final String BIRTHDAY = "//*[@id=\"xjkpTable\"]/tbody/tr[5]/td[2]"; |
|
||||||
|
|
||||||
public static final String HOMETOWN = "//*[@id=\"xjkpTable\"]/tbody/tr[7]/td[2]"; |
|
||||||
|
|
||||||
public static final String NATIONALITY = "//*[@id=\"xjkpTable\"]/tbody/tr[8]/td[4]"; |
|
||||||
|
|
||||||
public static final String ID_NUMBER = "//*[@id=\"xjkpTable\"]/tbody/tr[50]/td[4]"; |
|
||||||
} |
|
@ -0,0 +1,30 @@ |
|||||||
|
package cn.linghang.mywust.core.request.library.response; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class BaseInfo { |
||||||
|
|
||||||
|
@JsonProperty("map") |
||||||
|
private Map map; |
||||||
|
|
||||||
|
@JsonProperty("empty") |
||||||
|
private boolean empty; |
||||||
|
|
||||||
|
public void setMap(Map map) { |
||||||
|
this.map = map; |
||||||
|
} |
||||||
|
|
||||||
|
public Map getMap() { |
||||||
|
return map; |
||||||
|
} |
||||||
|
|
||||||
|
public void setEmpty(boolean empty) { |
||||||
|
this.empty = empty; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isEmpty() { |
||||||
|
return empty; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package cn.linghang.mywust.core.request.library.response; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class DetailInfo { |
||||||
|
|
||||||
|
@JsonProperty("map") |
||||||
|
private Map map; |
||||||
|
|
||||||
|
@JsonProperty("empty") |
||||||
|
private boolean empty; |
||||||
|
|
||||||
|
public void setMap(Map map) { |
||||||
|
this.map = map; |
||||||
|
} |
||||||
|
|
||||||
|
public Map getMap() { |
||||||
|
return map; |
||||||
|
} |
||||||
|
|
||||||
|
public void setEmpty(boolean empty) { |
||||||
|
this.empty = empty; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isEmpty() { |
||||||
|
return empty; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package cn.linghang.mywust.core.request.library.response; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class ExtraInfo { |
||||||
|
|
||||||
|
@JsonProperty("map") |
||||||
|
private Map map; |
||||||
|
|
||||||
|
@JsonProperty("empty") |
||||||
|
private boolean empty; |
||||||
|
|
||||||
|
public void setMap(Map map) { |
||||||
|
this.map = map; |
||||||
|
} |
||||||
|
|
||||||
|
public Map getMap() { |
||||||
|
return map; |
||||||
|
} |
||||||
|
|
||||||
|
public void setEmpty(boolean empty) { |
||||||
|
this.empty = empty; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isEmpty() { |
||||||
|
return empty; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,49 @@ |
|||||||
|
package cn.linghang.mywust.core.request.library.response; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class LoanResultItem { |
||||||
|
@JsonProperty("bibId") |
||||||
|
private String bookId; |
||||||
|
|
||||||
|
@JsonProperty("bibAttrs") |
||||||
|
private BookAttribute bookAttribute; |
||||||
|
|
||||||
|
@JsonProperty("returnDate") |
||||||
|
private String returnDate; |
||||||
|
|
||||||
|
@JsonProperty("loanDate") |
||||||
|
private String loanDate; |
||||||
|
|
||||||
|
@JsonProperty("location") |
||||||
|
private String location; |
||||||
|
|
||||||
|
@JsonProperty("barCode") |
||||||
|
private String barCode; |
||||||
|
|
||||||
|
@Data |
||||||
|
public static class BookAttribute { |
||||||
|
@JsonProperty("pub_year") |
||||||
|
private String publishYear; |
||||||
|
|
||||||
|
@JsonProperty("author") |
||||||
|
private String author; |
||||||
|
|
||||||
|
@JsonProperty("callno") |
||||||
|
private String callNumber; |
||||||
|
|
||||||
|
@JsonProperty("isbn") |
||||||
|
private String isbn; |
||||||
|
|
||||||
|
@JsonProperty("classno") |
||||||
|
private String classNumber; |
||||||
|
|
||||||
|
@JsonProperty("publisher") |
||||||
|
private String publisher; |
||||||
|
|
||||||
|
@JsonProperty("title") |
||||||
|
private String title; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,64 @@ |
|||||||
|
package cn.linghang.mywust.core.request.library.response; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class Map { |
||||||
|
@JsonProperty("baseInfo") |
||||||
|
private BaseInfo baseInfo; |
||||||
|
|
||||||
|
@JsonProperty("detailInfo") |
||||||
|
private DetailInfo detailInfo; |
||||||
|
|
||||||
|
@JsonProperty("extraInfo") |
||||||
|
private ExtraInfo extraInfo; |
||||||
|
|
||||||
|
@JsonProperty("score") |
||||||
|
private int score; |
||||||
|
|
||||||
|
@JsonProperty("_clickCount") |
||||||
|
private int clickCount; |
||||||
|
|
||||||
|
@JsonProperty("collected") |
||||||
|
private boolean collected; |
||||||
|
|
||||||
|
@JsonProperty("出版发行项") |
||||||
|
private String publisher; |
||||||
|
|
||||||
|
@JsonProperty("个人责任者") |
||||||
|
private String author; |
||||||
|
|
||||||
|
@JsonProperty("提要文摘附注") |
||||||
|
private String describe; |
||||||
|
|
||||||
|
@JsonProperty("ISBN及定价") |
||||||
|
private String isbn; |
||||||
|
|
||||||
|
@JsonProperty("载体形态项") |
||||||
|
private String size; |
||||||
|
|
||||||
|
@JsonProperty("学科主题") |
||||||
|
private String category; |
||||||
|
|
||||||
|
@JsonProperty("使用对象附注") |
||||||
|
private String reader; |
||||||
|
|
||||||
|
@JsonProperty("责任者附注") |
||||||
|
private String authorDescribe; |
||||||
|
|
||||||
|
@JsonProperty("中图法分类号") |
||||||
|
private String clcNumber; |
||||||
|
|
||||||
|
@JsonProperty("著录信息附注") |
||||||
|
private String publishNotes; |
||||||
|
|
||||||
|
@JsonProperty("丛编项") |
||||||
|
private String series; |
||||||
|
|
||||||
|
@JsonProperty("题名/责任者") |
||||||
|
private String fullTitle; |
||||||
|
|
||||||
|
@JsonProperty("title") |
||||||
|
private String title; |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package cn.linghang.mywust.core.request.library.response; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||||
|
|
||||||
|
public class Response{ |
||||||
|
|
||||||
|
@JsonProperty("map") |
||||||
|
private Map map; |
||||||
|
|
||||||
|
public void setMap(Map map){ |
||||||
|
this.map = map; |
||||||
|
} |
||||||
|
|
||||||
|
public Map getMap(){ |
||||||
|
return map; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,150 @@ |
|||||||
|
package cn.linghang.mywust.core.request.library.response; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Data |
||||||
|
public class SearchResultItem { |
||||||
|
/** |
||||||
|
* 图书id |
||||||
|
*/ |
||||||
|
@JsonProperty("bibId") |
||||||
|
private String bookId; |
||||||
|
|
||||||
|
/** |
||||||
|
* 作者 |
||||||
|
*/ |
||||||
|
@JsonProperty("author") |
||||||
|
private String author; |
||||||
|
|
||||||
|
/** |
||||||
|
* 索书号 |
||||||
|
*/ |
||||||
|
@JsonProperty("callno") |
||||||
|
private List<String> callNumber; |
||||||
|
|
||||||
|
/** |
||||||
|
* doc类型 |
||||||
|
*/ |
||||||
|
@JsonProperty("docType") |
||||||
|
private String docType; |
||||||
|
|
||||||
|
/** |
||||||
|
* 分组id |
||||||
|
*/ |
||||||
|
@JsonProperty("groupId") |
||||||
|
private String groupId; |
||||||
|
|
||||||
|
/** |
||||||
|
* ISBN号 |
||||||
|
*/ |
||||||
|
@JsonProperty("isbn") |
||||||
|
private String isbn; |
||||||
|
|
||||||
|
@JsonProperty("bibNo") |
||||||
|
private String bibNo; |
||||||
|
|
||||||
|
/** |
||||||
|
* 标题 |
||||||
|
*/ |
||||||
|
@JsonProperty("title") |
||||||
|
private String title; |
||||||
|
|
||||||
|
/** |
||||||
|
* 图书总数 |
||||||
|
*/ |
||||||
|
@JsonProperty("itemCount") |
||||||
|
private int itemCount; |
||||||
|
|
||||||
|
/** |
||||||
|
* 可借数 |
||||||
|
*/ |
||||||
|
@JsonProperty("circCount") |
||||||
|
private int circCount; |
||||||
|
|
||||||
|
/** |
||||||
|
* 出版年 |
||||||
|
*/ |
||||||
|
@JsonProperty("pub_year") |
||||||
|
private String publishYear; |
||||||
|
|
||||||
|
/** |
||||||
|
* 分类号 |
||||||
|
*/ |
||||||
|
@JsonProperty("classno") |
||||||
|
private String classNumber; |
||||||
|
|
||||||
|
/** |
||||||
|
* 出版商 |
||||||
|
*/ |
||||||
|
@JsonProperty("publisher") |
||||||
|
private String publisher; |
||||||
|
|
||||||
|
/** |
||||||
|
* 馆藏信息,原始数据为json字符串 |
||||||
|
*/ |
||||||
|
@JsonProperty("holdings") |
||||||
|
private String collectionInfo; |
||||||
|
|
||||||
|
/** |
||||||
|
* 馆藏信息 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public static class CollectionInfo { |
||||||
|
/** |
||||||
|
* 索书号 |
||||||
|
*/ |
||||||
|
@JsonProperty("callNo") |
||||||
|
private String callNumber; |
||||||
|
|
||||||
|
/** |
||||||
|
* 馆藏总数 |
||||||
|
*/ |
||||||
|
@JsonProperty("itemsCount") |
||||||
|
private int itemsCount; |
||||||
|
|
||||||
|
/** |
||||||
|
* 图书条码 |
||||||
|
*/ |
||||||
|
@JsonProperty("barCode") |
||||||
|
private String barCode; |
||||||
|
|
||||||
|
/** |
||||||
|
* 可借状态 |
||||||
|
*/ |
||||||
|
@JsonProperty("circStatus") |
||||||
|
private int circStatus; |
||||||
|
|
||||||
|
/** |
||||||
|
* 书籍分卷信息 |
||||||
|
*/ |
||||||
|
@JsonProperty("vol") |
||||||
|
private String vol; |
||||||
|
|
||||||
|
/** |
||||||
|
* 图书可借状态 |
||||||
|
*/ |
||||||
|
@JsonProperty("itemsAvailable") |
||||||
|
private int itemsAvailable; |
||||||
|
|
||||||
|
/** |
||||||
|
* 所属馆藏地 |
||||||
|
*/ |
||||||
|
@JsonProperty("location") |
||||||
|
private String location; |
||||||
|
|
||||||
|
/** |
||||||
|
* 捐赠者id |
||||||
|
*/ |
||||||
|
@JsonProperty("donatorId") |
||||||
|
private Object donatorId; |
||||||
|
|
||||||
|
/** |
||||||
|
* 状态信息 |
||||||
|
*/ |
||||||
|
@JsonProperty("status") |
||||||
|
private String status; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
package cn.linghang.mywust.core.service.graduate; |
||||||
|
|
||||||
|
import cn.linghang.mywust.core.api.Graduate; |
||||||
|
import cn.linghang.mywust.core.exception.ApiException; |
||||||
|
import cn.linghang.mywust.core.request.RequestFactory; |
||||||
|
import cn.linghang.mywust.network.RequestClientOption; |
||||||
|
import cn.linghang.mywust.network.Requester; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class GraduateApiService { |
||||||
|
protected final Requester requester; |
||||||
|
|
||||||
|
public GraduateApiService(Requester requester) { |
||||||
|
this.requester = requester; |
||||||
|
} |
||||||
|
|
||||||
|
public void checkResponse(HttpResponse response) throws ApiException { |
||||||
|
// 检查响应是否正确
|
||||||
|
if (response.getBody() == null || |
||||||
|
response.getStatusCode() != HttpResponse.HTTP_OK || |
||||||
|
new String(response.getBody()).contains("name=\"_ctl0:txtpassword\"")) { |
||||||
|
|
||||||
|
throw new ApiException(ApiException.Code.COOKIE_INVALID); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void checkCookies(String cookie, RequestClientOption option) throws ApiException, IOException { |
||||||
|
HttpRequest request = RequestFactory.makeHttpRequest(Graduate.GRADUATE_INDEX_TEST_API, null, cookie); |
||||||
|
HttpResponse response = requester.get(request, option); |
||||||
|
|
||||||
|
this.checkResponse(response); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package cn.linghang.mywust.core.service.graduate; |
||||||
|
|
||||||
|
import cn.linghang.mywust.core.exception.ApiException; |
||||||
|
import cn.linghang.mywust.core.request.graduate.GraduateRequestFactory; |
||||||
|
import cn.linghang.mywust.network.RequestClientOption; |
||||||
|
import cn.linghang.mywust.network.Requester; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class GraduateCourseTableApiService extends GraduateApiService{ |
||||||
|
|
||||||
|
public GraduateCourseTableApiService(Requester requester) { |
||||||
|
super(requester); |
||||||
|
} |
||||||
|
|
||||||
|
public String getCourseTablePage(String cookie, RequestClientOption option) throws IOException, ApiException { |
||||||
|
HttpRequest request = GraduateRequestFactory.courseTableRequest(cookie); |
||||||
|
HttpResponse response = requester.get(request, option); |
||||||
|
super.checkResponse(response); |
||||||
|
|
||||||
|
return new String(response.getBody()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package cn.linghang.mywust.core.service.graduate; |
||||||
|
|
||||||
|
import cn.linghang.mywust.core.exception.ApiException; |
||||||
|
import cn.linghang.mywust.core.request.graduate.GraduateRequestFactory; |
||||||
|
import cn.linghang.mywust.network.RequestClientOption; |
||||||
|
import cn.linghang.mywust.network.Requester; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class GraduateScoreApiService extends GraduateApiService{ |
||||||
|
|
||||||
|
public GraduateScoreApiService(Requester requester) { |
||||||
|
super(requester); |
||||||
|
} |
||||||
|
|
||||||
|
public String getCourseTablePage(String cookie, RequestClientOption option) throws IOException, ApiException { |
||||||
|
HttpRequest request = GraduateRequestFactory.examScoreInfoRequest(cookie); |
||||||
|
HttpResponse response = requester.get(request, option); |
||||||
|
super.checkResponse(response); |
||||||
|
|
||||||
|
return new String(response.getBody()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package cn.linghang.mywust.core.service.graduate; |
||||||
|
|
||||||
|
import cn.linghang.mywust.core.exception.ApiException; |
||||||
|
import cn.linghang.mywust.core.request.graduate.GraduateRequestFactory; |
||||||
|
import cn.linghang.mywust.network.RequestClientOption; |
||||||
|
import cn.linghang.mywust.network.Requester; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class GraduateStudentInfoApiService extends GraduateApiService { |
||||||
|
|
||||||
|
public GraduateStudentInfoApiService(Requester requester) { |
||||||
|
super(requester); |
||||||
|
} |
||||||
|
|
||||||
|
public String getStudentInfoPage(String cookie, RequestClientOption option) throws ApiException, IOException { |
||||||
|
HttpRequest request = GraduateRequestFactory.studentInfoRequest(cookie); |
||||||
|
HttpResponse response = requester.get(request, option); |
||||||
|
super.checkResponse(response); |
||||||
|
|
||||||
|
return new String(response.getBody()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package cn.linghang.mywust.core.service.graduate; |
||||||
|
|
||||||
|
import cn.linghang.mywust.core.exception.ApiException; |
||||||
|
import cn.linghang.mywust.core.request.graduate.GraduateRequestFactory; |
||||||
|
import cn.linghang.mywust.network.RequestClientOption; |
||||||
|
import cn.linghang.mywust.network.Requester; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class GraduateTrainingPlanApiService extends GraduateApiService{ |
||||||
|
|
||||||
|
public GraduateTrainingPlanApiService(Requester requester) { |
||||||
|
super(requester); |
||||||
|
} |
||||||
|
|
||||||
|
public String getCourseTablePage(String cookie, RequestClientOption option) throws IOException, ApiException { |
||||||
|
HttpRequest request = GraduateRequestFactory.trainingPlanPageRequest(cookie); |
||||||
|
HttpResponse response = requester.get(request, option); |
||||||
|
super.checkResponse(response); |
||||||
|
|
||||||
|
return new String(response.getBody()); |
||||||
|
} |
||||||
|
} |
@ -1,4 +1,4 @@ |
|||||||
package cn.linghang.mywust.core.service.library; |
package cn.linghang.mywust.core.service.library; |
||||||
|
|
||||||
public class LibraryService { |
public class LibraryApiService { |
||||||
} |
} |
@ -0,0 +1,31 @@ |
|||||||
|
package cn.linghang.mywust.core.service.physics; |
||||||
|
|
||||||
|
import cn.linghang.mywust.core.exception.ApiException; |
||||||
|
import cn.linghang.mywust.core.request.physics.PhysicsSystemRequestFactory; |
||||||
|
import cn.linghang.mywust.network.RequestClientOption; |
||||||
|
import cn.linghang.mywust.network.Requester; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class PhysicsApiService { |
||||||
|
private final Requester requester; |
||||||
|
|
||||||
|
public PhysicsApiService(Requester requester) { |
||||||
|
this.requester = requester; |
||||||
|
} |
||||||
|
|
||||||
|
public String getCoursePage(String cookie, RequestClientOption requestClientOption) throws IOException, ApiException { |
||||||
|
requestClientOption.setFallowUrlRedirect(false); |
||||||
|
|
||||||
|
// 请求真正的课表页
|
||||||
|
HttpRequest coursePageRequest = PhysicsSystemRequestFactory.physicsCourseRequest(cookie); |
||||||
|
HttpResponse courseResponse = requester.get(coursePageRequest, requestClientOption); |
||||||
|
if (courseResponse.getStatusCode() != HttpResponse.HTTP_OK) { |
||||||
|
throw new ApiException(ApiException.Code.COOKIE_INVALID); |
||||||
|
} |
||||||
|
|
||||||
|
return new String(courseResponse.getBody()); |
||||||
|
} |
||||||
|
} |
@ -1,38 +0,0 @@ |
|||||||
package cn.linghang.mywust.core.service.undergraduate; |
|
||||||
|
|
||||||
import cn.linghang.mywust.core.exception.CookieInvalidException; |
|
||||||
import cn.linghang.mywust.core.exception.ParseException; |
|
||||||
import cn.linghang.mywust.core.parser.undergraduate.StudentInfoPageParser; |
|
||||||
import cn.linghang.mywust.core.request.undergrade.BkjxRequestFactory; |
|
||||||
import cn.linghang.mywust.model.global.StudentInfo; |
|
||||||
import cn.linghang.mywust.network.RequestClientOption; |
|
||||||
import cn.linghang.mywust.network.Requester; |
|
||||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
|
||||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class StudentInfoApi extends UndergraduateApi { |
|
||||||
private final Requester requester; |
|
||||||
|
|
||||||
private static final StudentInfoPageParser parser = new StudentInfoPageParser(); |
|
||||||
|
|
||||||
public StudentInfoApi(Requester requester) { |
|
||||||
this.requester = requester; |
|
||||||
} |
|
||||||
|
|
||||||
public String getStudentInfoPage(String cookies, RequestClientOption requestOption) throws IOException, CookieInvalidException { |
|
||||||
HttpRequest request = BkjxRequestFactory.studentInfoRequest(cookies); |
|
||||||
HttpResponse response = requester.get(request, requestOption); |
|
||||||
|
|
||||||
checkResponse(response, cookies); |
|
||||||
|
|
||||||
return new String(response.getBody()); |
|
||||||
} |
|
||||||
|
|
||||||
public StudentInfo getStudentInfo(String cookies, RequestClientOption requestOption) throws IOException, CookieInvalidException, ParseException { |
|
||||||
String studentInfoPage = this.getStudentInfoPage(cookies, requestOption); |
|
||||||
|
|
||||||
return parser.parse(studentInfoPage); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,26 @@ |
|||||||
|
package cn.linghang.mywust.core.service.undergraduate; |
||||||
|
|
||||||
|
import cn.linghang.mywust.core.exception.ApiException; |
||||||
|
import cn.linghang.mywust.core.request.undergrade.BkjxRequestFactory; |
||||||
|
import cn.linghang.mywust.network.RequestClientOption; |
||||||
|
import cn.linghang.mywust.network.Requester; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class StudentInfoApiService extends UndergraduateApiService { |
||||||
|
|
||||||
|
public StudentInfoApiService(Requester requester) { |
||||||
|
super(requester); |
||||||
|
} |
||||||
|
|
||||||
|
public String getStudentInfoPage(String cookies, RequestClientOption requestOption) throws IOException, ApiException { |
||||||
|
HttpRequest request = BkjxRequestFactory.studentInfoRequest(cookies); |
||||||
|
HttpResponse response = requester.get(request, requestOption); |
||||||
|
|
||||||
|
super.checkResponse(response); |
||||||
|
|
||||||
|
return new String(response.getBody()); |
||||||
|
} |
||||||
|
} |
@ -1,36 +0,0 @@ |
|||||||
package cn.linghang.mywust.core.service.undergraduate; |
|
||||||
|
|
||||||
import cn.linghang.mywust.core.exception.CookieInvalidException; |
|
||||||
import cn.linghang.mywust.core.exception.ParseException; |
|
||||||
import cn.linghang.mywust.core.parser.undergraduate.TrainingPlanPageParser; |
|
||||||
import cn.linghang.mywust.core.request.undergrade.BkjxRequestFactory; |
|
||||||
import cn.linghang.mywust.network.RequestClientOption; |
|
||||||
import cn.linghang.mywust.network.Requester; |
|
||||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
|
||||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
|
|
||||||
public class TrainingPlanApi extends UndergraduateApi { |
|
||||||
private final Requester requester; |
|
||||||
|
|
||||||
private static final TrainingPlanPageParser parser = new TrainingPlanPageParser(); |
|
||||||
|
|
||||||
public TrainingPlanApi(Requester requester) { |
|
||||||
this.requester = requester; |
|
||||||
} |
|
||||||
|
|
||||||
public String getTrainingPlanPage(String cookies, RequestClientOption requestClientOption) throws CookieInvalidException, IOException { |
|
||||||
HttpRequest request = BkjxRequestFactory.trainingPlanPageRequest(cookies); |
|
||||||
HttpResponse response = requester.get(request, requestClientOption); |
|
||||||
|
|
||||||
checkResponse(response, cookies); |
|
||||||
|
|
||||||
return new String(response.getBody()); |
|
||||||
} |
|
||||||
|
|
||||||
public String getPrueSchemePage(String cookies, RequestClientOption requestClientOption) throws IOException, CookieInvalidException, ParseException { |
|
||||||
String fullPage = this.getTrainingPlanPage(cookies, requestClientOption); |
|
||||||
return parser.parse(fullPage); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,26 @@ |
|||||||
|
package cn.linghang.mywust.core.service.undergraduate; |
||||||
|
|
||||||
|
import cn.linghang.mywust.core.exception.ApiException; |
||||||
|
import cn.linghang.mywust.core.request.undergrade.BkjxRequestFactory; |
||||||
|
import cn.linghang.mywust.network.RequestClientOption; |
||||||
|
import cn.linghang.mywust.network.Requester; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class TrainingPlanApiService extends UndergraduateApiService { |
||||||
|
|
||||||
|
public TrainingPlanApiService(Requester requester) { |
||||||
|
super(requester); |
||||||
|
} |
||||||
|
|
||||||
|
public String getTrainingPlanPage(String cookies, RequestClientOption requestClientOption) throws IOException, ApiException { |
||||||
|
HttpRequest request = BkjxRequestFactory.trainingPlanPageRequest(cookies); |
||||||
|
HttpResponse response = requester.get(request, requestClientOption); |
||||||
|
|
||||||
|
super.checkResponse(response); |
||||||
|
|
||||||
|
return new String(response.getBody()); |
||||||
|
} |
||||||
|
} |
@ -1,17 +0,0 @@ |
|||||||
package cn.linghang.mywust.core.service.undergraduate; |
|
||||||
|
|
||||||
import cn.linghang.mywust.core.exception.CookieInvalidException; |
|
||||||
import cn.linghang.mywust.core.util.BkjxUtil; |
|
||||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
|
||||||
|
|
||||||
public class UndergraduateApi { |
|
||||||
public void checkResponse(HttpResponse response, String cookies) throws CookieInvalidException { |
|
||||||
// 检查响应是否正确
|
|
||||||
if (response.getBody() == null || |
|
||||||
response.getStatusCode() != HttpResponse.HTTP_OK || |
|
||||||
BkjxUtil.checkLoginFinger(response.getBody())) { |
|
||||||
|
|
||||||
throw new CookieInvalidException("响应无效,cookie可能过期:" + cookies); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,38 @@ |
|||||||
|
package cn.linghang.mywust.core.service.undergraduate; |
||||||
|
|
||||||
|
import cn.linghang.mywust.core.api.Bkjx; |
||||||
|
import cn.linghang.mywust.core.exception.ApiException; |
||||||
|
import cn.linghang.mywust.core.request.RequestFactory; |
||||||
|
import cn.linghang.mywust.core.request.undergrade.BkjxRequestFactory; |
||||||
|
import cn.linghang.mywust.core.util.BkjxUtil; |
||||||
|
import cn.linghang.mywust.network.RequestClientOption; |
||||||
|
import cn.linghang.mywust.network.Requester; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||||
|
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||||
|
|
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
public class UndergraduateApiService { |
||||||
|
protected final Requester requester; |
||||||
|
|
||||||
|
public UndergraduateApiService(Requester requester) { |
||||||
|
this.requester = requester; |
||||||
|
} |
||||||
|
|
||||||
|
public void checkResponse(HttpResponse response) throws ApiException { |
||||||
|
// 检查响应是否正确
|
||||||
|
if (response.getBody() == null || |
||||||
|
response.getStatusCode() != HttpResponse.HTTP_OK || |
||||||
|
BkjxUtil.checkLoginFinger(response.getBody())) { |
||||||
|
|
||||||
|
throw new ApiException(ApiException.Code.COOKIE_INVALID); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void checkCookies(String cookie, RequestClientOption option) throws ApiException, IOException { |
||||||
|
HttpRequest request = RequestFactory.makeHttpRequest(Bkjx.BKJX_TEST_API, null, cookie); |
||||||
|
HttpResponse response = requester.get(request, option); |
||||||
|
|
||||||
|
this.checkResponse(response); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
package cn.linghang.mywust.core.util; |
||||||
|
|
||||||
|
import org.jsoup.Jsoup; |
||||||
|
import org.jsoup.nodes.Document; |
||||||
|
import org.jsoup.nodes.Element; |
||||||
|
import org.jsoup.select.Elements; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* html页面表单参数提取,用于简化部分繁琐的表单数据生成,模拟网页表单数据的请求参数 |
||||||
|
*/ |
||||||
|
public class PageFormExtractor { |
||||||
|
public static void extractToMap(String html, String formId, Map<String, String> targetMap) { |
||||||
|
Document page = Jsoup.parse(html); |
||||||
|
Element form = page.getElementById(formId); |
||||||
|
if (form == null) { |
||||||
|
throw new NullPointerException("The Form Doesn't exist."); |
||||||
|
} |
||||||
|
|
||||||
|
Elements formElements = form.getElementsByAttribute("name"); |
||||||
|
|
||||||
|
for (Element element : formElements) { |
||||||
|
targetMap.put(element.attr("name"), element.attr("value")); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,2 @@ |
|||||||
|
public class UnderGraduateTest { |
||||||
|
} |
Loading…
Reference in new issue