一个 V2EX 社区(以下简称 V 站) API 库,基于 OkHttp 拦截器实现。虽然 V 站提供了一些 API 接口,不过接口数量少且无用户登录相关接口,所以该库的目的就是通过解析 V 站的 HTML 静态页面数据以生成相应的 json 接口数据,来使你方便的编写自己的 V2EX 社区客户端,具有以下功能:
- 使用简单,无需关心繁琐的数据解析,直接拿到 json 数据。
- 内部自动管理页面相关 cookies。
- 覆盖绝大部分开发第三方客户端所需接口。
- 用户信息失效、以及其他错误处理。
-
添加 Gradle 依赖:
implementation 'com.imhanjie.library:v2ex-api:0.2.1'
-
在 Application 中初始化:
class MyApp : Application() { override fun onCreate() { super.onCreate() ... V2exApi.init { // 返回在登录接口拿到的用户标识 cookie 值, 没有或未登录可返回 null or "" "return your cookie" } ... } }
-
配置 OkHttp 客户端:
... val builder = OkHttpClient.Builder() builder .followRedirects(false) // 禁用 302 重定向 .followSslRedirects(false) // 禁用 302 重定向 .addInterceptor(HeaderInterceptor()) .addInterceptor(LoginInterceptor()) .addInterceptor(ParserInterceptor()) .addInterceptor(CookieInterceptor) val okHttpClient: OkHttpClient = builder.build() ...
⚠️ 注意事项:- 需要禁用 302 重定向,因为框架内部单独处理了 302 情况。
addInterceptor()
添加的拦截器顺序要按照 👆 的顺序,不可更改。
下面以访问 V2EX 首页数据接口为例,更多完整接口文档见 👉 项目 WiKi。
我这里使用的是 Retrofit 请求框架,可自行使用你项目中请求方式,如果你也使用的是 Retrofit,可以参考我写的一个 V2EX 客户端项目的 ApiService 完整接口文件。
interface ApiService {
@GET("/")
fun loadLatestTopics(
@Query("tab") tab: String
): RestfulResult<List<TopicItem>>
}
返回的数据结构如下:
{
"code": 1,
"data": [
{
"id": 650005,
"isTop": true,
"latestReplyTime": "36 分钟前",
"nodeName": "promotions",
"nodeTitle": "推广",
"replies": 13,
"title": "在线表格文档系统开发,五大技术难点及解决方案",
"userAvatar": "https://cdn.v2ex.com/avatar/7e10/4ee6/465154_normal.png?m\u003d1579056398",
"userName": "GrapeCityChina"
},
{
"id": 675671,
"isTop": false,
"latestReplyTime": "刚刚",
"nodeName": "games",
"nodeTitle": "游戏",
"replies": 1,
"title": "有没有什么好玩的手机游戏推荐一下?安卓设备",
"userAvatar": "https://cdn.v2ex.com/gravatar/9d1e4e86858d71d530436b6158c2bc79?s\u003d48\u0026d\u003dretro",
"userName": "0x666666"
}
]
}
项目中核心的 3 个拦截器简要说明:
- HeaderInterceptor:用于处理部分接口请求时需要添加一些动态请求头。
- LoginInterceptor:专门用于处理登录接口是否登录成功以及登录失败原因的解析。
- ParserInterceptor:处理 302 重定向以及所有 html --> json 的数据解析。
- CookieInterceptor:用于缓存每个页面的 once 动态码与 cookies 的对应关系。
所有完整接口文档见 👉 项目 WiKi
由于本项目的实现原理是通过解析 V2EX 网站的 HTML 数据来实现的,所以不可避免的遇到日后 V2EX 网站更新所可能导致的解析错误,所以本项目会持续更新,若有疑问或者额外的解析需求,例如想接口添加字段等,可以通过提 issue 来反馈。