APP接口开发的入门指南(写毕设的看看)

特别说明

当前博客平台账号已废弃,如果有使用细节问题请前往我新博客平台进行讨论交流。

个人博客平台 HuRuWo的技术小站

文章首发于个人博客HuRuWo的技术小站,如果本文非vip用户无法完全浏览或者图片无法打开,可前往个人博客文章地址查看文章并留言讨论。

个人博客文章地址APP接口开发的入门指南(写毕设的看看)

更多技术文章访问本人博客HuRuWo的技术小站,包括 Electron从零开发 Android 逆向 app 微信数据抓取 抖音数据抓取 闲鱼数据抓取 小红书数据抓取 其他软件爬虫 等技术文章

前言

最近闲的不行,因为距离新版本发布还有一段时间。在这段时间里,我开始着手学点新东西。我瞄上了api的开发,虽然公司有专门的接口开发人员。但是我学好了,可以自己开发东西玩也是不错的。
现在是一月份,想起一年前写管理系统的时候。被API烦的不行,因为没有写过所以请了好几顿饭才让哥们写了个bug奇多的后台。如果你也是要写app毕设的同学,希望您能看到这篇文章(看缘分)。

技术选型

  • 语言:java 作为android 开发,首选 java 不解释
  • 框架:这个就多了,作为最好的(不是php)后端语言之一。java的框架数不胜数,仔细对比了之后选择了blade 这个框架。主要原因如下:
    1.开源 开源意味着可以查看和修改框架-->开源地址
    2.活跃 不仅社区活跃,而且还在持续更新。我提问之后,能很快回答
    3.文档清楚,入门简单。blade文档 如果看不懂,还有视频教程。

工具准备

AndroidStudio
VSCode
IntelliJ IDEA
GIT
SqliteStudio
谷歌浏览器+postman插件
swagger

实战部分

项目选择

api 无非就是增删改查 --crud,一个最好的实例就是 note记事本。所以这个项目就是记事本的开发。

API开发部分

1.导入必须的依赖、插件

打开IntelliJ IDEA,新建maven项目,在pom.xml里面添加相关的东西。

 <dependencies>
        <!-- mvc dependency -->
        <dependency>
            <groupId>com.bladejava</groupId>
            <artifactId>blade-mvc</artifactId>
            <version>2.0.6-BETA</version>
        </dependency>
       
       <!--sqlite数据库-->
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.15.1</version>
        </dependency>
    
        <dependency>
            <groupId>com.bladejava</groupId>
            <artifactId>blade-jdbc</artifactId>
            <version>0.2.2-RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <scope>provided</scope>
        </dependency>


    </dependencies>
    <build>
        <!--打包文件夹-->
        <finalName>restful</finalName>

        <!--资源路径-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
            </resource>
        </resources>

        <!--配置文件编译版本-->
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

以上直接复制即可,具体解释看注释即可。

2.来一个helloworld

新建Application.java文件,写main函数并初始化框架。

public static void main(String[] args) {
        Blade.me() .start(HelloApplication.class, args);
    }

运行他,默认访问端口 127.0.0.1:9000

发现啥都没有,所以添加一个数据返回:

public static void main(String[] args) {
        Blade.me().get("/", (request, response) -> response.text("Hello World"))
                .start(Application.class, args);
    }

重启项目,这回有了。
其他端口监听,设置listen

        Blade.me().listen(880).start(Application.class, args);

3.返回json格式的数据
首选我们把监听写到控制器里面去,只需要在累上加上@Path注解即可。

@Path(value = "user")
public class UserController {
}

其中user是访问路径,也就是访问127.0.0.1:9000/user的时候会进入这个控制器。

@PostRoute("test")
    @JSON
    public RestResponse register(@Param String test) {

        if(test!=null){
            return RestResponse.ok(test);
        }
        else {
            return RestResponse.fail("数据不能为空");
        }
    }

一个post测试接口:@PostRoute("test")表示地址和方式,JSON表示返回数据格式:

不传数据

image.png

数据传递
image.png

4.数据库的链接

关键的地方来了,有数据库的后台才能算真正的后台。我这次选择的是sqlite数据库,特点就是不需要安装,只需要一个数据库文件。

(请确认已加入相关的依赖):

使用sqlitestudio工具新建数据库.db文件,同时添加一个表t_user对应实体类user

把db文件放到根目录下即可,为了更方便的创建db文件。
可以使用sqlitestudio的导出功能,把数据库导出为.sql文件

image.png

创建一个SqliteJdbc.java
核心代码如下:

    public static void importSql(boolean devMode) {
        try {

            DB_PATH = Const.CLASSPATH + File.separatorChar + DB_NAME;
            DB_SRC = "jdbc:sqlite://" + DB_PATH;

            if (devMode) {
                DB_PATH = System.getProperty("user.dir") + "/" + DB_NAME;
                DB_SRC = "jdbc:sqlite://" + DB_PATH;
            }

            log.info("blade dev mode: {}", devMode);
            log.info("load sqlite database path [{}]", DB_PATH);
            log.info("load sqlite database src [{}]", DB_SRC);

            Connection con       = DriverManager.getConnection(DB_SRC);
            Statement  statement = con.createStatement();
            ResultSet  rs        = statement.executeQuery("SELECT count(*) FROM sqlite_master WHERE type='table' AND name='t_options'");
            int        count     = rs.getInt(1);
            if (count == 0) {
                String            cp  = SqliteJdbc.class.getClassLoader().getResource("").getPath();
                InputStreamReader isr = new InputStreamReader(new FileInputStream(cp + "schema.sql"), "UTF-8");
                /**
                 * 根据.sql文件写入
                 */
                try {
                    String sql = new BufferedReader(isr).lines().collect(Collectors.joining("\n"));
                    int r = statement.executeUpdate(sql);
                    log.info("initialize import database - {}", r);
                }
                catch (SQLiteException e){
                    log.info("initialize import database - {}", e.getResultCode());
                }
            }
            rs.close();
            statement.close();
            con.close();
            log.info("database path is: {}", DB_PATH);
        } catch (Exception e) {
            log.error("initialize database fail", e);
        }
    }

几个关键的点:

  1. devMode设置 加载形式 如果为真,加载db文件 如果获取失败 从 .sql 文件加载 为false 直接从sql文件加载
    2.设置 db文件路径
    3.记得关闭Connection

5.增删改查 操作

连接好数据库之后,就可以通过接口对数据进行操作:

在java web 里面 负责这部分操作的是控制器Controller (也就是MVC架构中的C)
新增一个NoteController.java,文件开头添加注解

@Path(value = "note")

表示 note/ 的访问将转入这个控制器处理:

查询操作:

 @GetRoute("list")
    @JSON
    public ARestResponse register(@Param int uid) {

        try {


            //fields 表示取出特定的数据
            //List<Notes> list =new Notes().findAll(Fields.of("content"));

            List<Notes> list = new Notes().where("uid", uid).findAll();

            return ARestResponse.ok(list);
        } catch (Exception e) {
            return ARestResponse.fail(e.getMessage());
        }

    }

很容易看出来GetRoute表示接受 get 操作 ,“list”表示访问路径。合起来就是note/list

Notes是继承了·ActiveRecord`的实体类,拥有crud能力(如果你用过郭神的数据库框架,应该不陌生).

@Table(value = "t_notes", pk = "noteid")
public class Notes extends ActiveRecord {

    //注意不能用Integer
    private Integer noteid;
    private Integer uid;
    private String content;
}

所以这样就能查询所有uid为uid的note记录

List<Notes> list = new Notes().where("uid", uid).findAll();

ARestResponse 是能返回固定json 数据的类,如果不符合你的要求可以自己写。

ARestResponse.ok:
ARestResponse.fail:

表示返回的状态:成功、失败。传入类既能输出格式化的json数据。

image.png

其他的增删改类似,不再一一列举。文档中相关操作非常清楚。

5.打包和发布
这个框架能打包成一个jar文件运行,具体操作如下:

  • pom.xml 文件配置打包插件
<plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                        <descriptor>package.xml</descriptor>
                    </descriptors>
                    <outputDirectory>${project.build.directory}/dist/</outputDirectory>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <!--记得修改-->
                            <mainClass>com.huruwo.demo.Application</mainClass>
                            <classpathPrefix>lib/</classpathPrefix>
                            <addClasspath>true</addClasspath>
                        </manifest>
                        <manifestEntries>
                            <!-- 在Class-Path下添加配置文件的路径 -->
                            <Class-Path>resources/</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>

记住mainClass这个东西,一定要修改成自己的Application路径,否则jar运行起来会报 找不到Application

  • 运行打包命令 maven package或者直接点击 右边
image.png

等到完成后BUILD SUCCESS
转到dist路径下的jar文件,打开命令行

java -jar xxxxx.jar

即可运行起来:
这里放一张我放在京东云的截图(xshell):

image.png

** 好了,已经可以直接访问服务器的接口了。**
我们可以配合着写一个 APP来测试接口,我已经写好了:

github 项目源码地址:Blade 搭建API服务器实例

总结

总体来说不难,blade是一个很容易上手的框架。用来写写api/博客网站问题不大。但是我们知道,真正的app API远远不知这些。
比如还有如何使用token防止接口滥用,api 的文档如何书写,session的保存,缓存的处理等等问题。
如果是做个课设/毕设什么的,我觉得还是能应付的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容