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的保存,缓存的处理等等问题。
如果是做个课设/毕设什么的,我觉得还是能应付的。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注