java开发实战 基于Resuful风格开发接口, IocDi和nginx,以及三层架构思想,分层解耦,并使用Apifox对接口数据进行测试。

news2024/11/19 4:40:26

开发规范:


    前后端分离:

        根据需求文档开发


    Resultful风格:


        REST(REpresentational State Transfer),表述性状态转换,它是一种软件架构风格。

     
POST(insert) 负责新增的操作


        http://localhost:8080/users

  DELETE(delete) 负责删除的操作

 http://localhost:8080/users/1

 
  PUT(update) 负责修改的操作

   http://localhost:8080/users


GET(select)负责查询的操作:


        http://localhost:8080/users/1

对比:

更利于项目的开发和维护


    Apifox


        介绍:

Apifox是一款集成了Api文档、Api调试、Api Mock、Api测试的一体化协作平台。


        作用:

接口文档管理、接口请求测试、Mock服务。

     官网: 

 https://apifox.com/

如何使用:

打开Apifox,在首页点击新建项目
  

名称自定义,然后点击确定。

新建快捷请求:

在进创建好的项目里面,点击快捷请求:

选择对应的请求方式(get,post,delete,put):

然后输入要访问的路径


查询部门案例:


    基本实现


        1,加载并读取dept.txt文本中的数据

// 读取数据
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("dept.txt");
List<String> lines = IOUtils.readLines(inputStream, "UTF-8");

                
        2,解析文本中的数据,并将其封装到集合中

//转换到集合中
List<Dept> deptList = lines.stream().map(line ->
        {
            String[] split = line.split(",");
            Integer id = Integer.valueOf(split[0]);
            String name = split[1];
            LocalDateTime updateTime = LocalDateTime.parse(split[2], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            return new Dept(id, name, updateTime);
        }
).toList();


        3,响应数据(json)格式

        

return deptList;

完整代码:

先创建实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {
    private Integer id;
    private String name;
    private LocalDateTime updateTime;

}

在写DeptController

@RestController
public class DeptsController {

    @GetMapping("/depts2")
    public List getDeptList() throws IOException {
        // 读取数据
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("dept.txt");
        List<String> lines = IOUtils.readLines(inputStream, "UTF-8");

        //转换到集合中
        List<Dept> deptList = lines.stream().map(line ->
                {
                    String[] split = line.split(",");
                    Integer id = Integer.valueOf(split[0]);
                    String name = split[1];
                    LocalDateTime updateTime = LocalDateTime.parse(split[2], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                    return new Dept(id, name, updateTime);
                }
        ).toList();
        return deptList;
    }
}

效果:


    统一响应结果:

  •         执行成功还是失败?
  •         响应的错误提示信息
  •         响应的数据

        定义统一的Result类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
    private Integer code;    //返回码 0成功 1 失败
    private String msg;     //返回描述
    private T data;         // 返回数据

    public static Result<Object> success(){
        return new Result<>(0,"操作成功",null);
    }
    public static Result<Object> success(String msg){
        return new Result<>(0,msg,null);
    }

    public static Result<Object> success(Object data){
        return new Result<>(0,"操作成功",data);
    }

    public static Result<Object> fail(){
        return new Result(1,"操作失败",null);
    }

    public static Result<Object> fail(String msg){
        return new Result(1,msg,null);
    }

}


    前后端联调测试

        nginx
            server {
   listen 90;
   #省略...
   location ^~ /api/ {
      rewrite ^/api/(.*)$ /$1 break;
      proxy_pass http://localhost:8080;
   }
}

 

  •                 localtion:用于定义匹配特定的url请求规则
  •                 ^~/api/ 表示精确匹配,即只可匹配以/api/开头的路径
  •                 rewrite 该指令用于重写匹配到的url路径
  •                 proxy_pass 该指令用于代理转发,他将匹配到的请求转发给位于后端的指令服务器


    三层架构:


        
        Controller  接收请求,响应数据


            controller 控制层,接收前端发送的请求,对请求进行处理,并响应数据。


        Service  逻辑处理


            service 业务逻辑层,处理具体的业务逻辑。


        Dao 数据访问


          数据访问层(Data Access Object)持久层,负责数据访问操作,包括数据的增删改查

​​​​​​​
        
    

定义DeptDao接口: 

 


public interface DeptDao {

    public List<String> list();
}
定义DeptDaoImpl实现类

 

public class DeptDaoImpl implements DeptDao {

   public List<String> list(){
       //加载文件,获取元素数据
       InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("dept.txt");
       List<String> lines = null;
       try {
           lines = IOUtils.readLines(inputStream, "UTF-8");
       } catch (IOException e) {
           throw new RuntimeException(e);
       }
       return lines;
   }
}

定义DeptService接口:
 
public interface DeptService {

    public List<Dept> getList();
}
定义DeptServiceImpl实现类:

public class DeptServiceImpl implements DeptService {

 
    private DeptDao deptDao = new DeptDaoImpl;

  public List<Dept> getList(){
      List<String> lines = deptDao.list();
      //对元素数据进行处理,组装部门数据
      List<Dept> deptList = lines.stream().map(line ->
              {
                  String[] split = line.split(",");
                  Integer id = Integer.valueOf(split[0]);
                  String name = split[1];
                  LocalDateTime updateTime = LocalDateTime.parse(split[2], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                  return new Dept(id, name, updateTime);
              }
      ).toList();
      return deptList;
  }
}
定义DeptController控制器
public class DeptController {


    private DeptService deptService = new DeptServiceImpl;

    @GetMapping("/depts")
    public com.sde.utils.Result getDeptList() throws IOException {
        List<Dept> deptList = deptService.getList();
        // 响应数据
        return Result.success(deptList);
    }
}
在Apifox测试:

分层解耦:


        耦合:衡量软件中各个层/模块之间的依赖、关联的程度
        内聚:软件中各个功能模块内部的功能联系。

        软件设计原则:高内聚低耦合。

    Ioc和DI入门:


        将Dao及Service层的实现类,交给Ioc容器管理
        为Controller及Service注入与你形式所依赖的对象。

控制反转:

Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

依赖注入:

Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。

Bean对象

:IOC容器中创建、管理的对象,称之为Bean


    Ico详解:
  • 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
  • 该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包。
TilasRun这个启动类是com.sde这个包的子类,其他的像,controller,dao,pojo,service,utils。都是com.sde的子类,因此@ComponentScan 可以扫描到。
        

例如我把TiasRun这个启动类放到,boot包下,就扫描不到了。

@Component


            声明bean的基础注解,不属于以下三类时,用此注解。


        @Controller


            @Component的衍生注解,标注在控制层类上。


        @Service


            @Component 的衍生注解,标注在业务层类上


        @Repository


            @Component的衍生注解,标注在数据访问层类上(由于与mybatis整合,用的少)


        DI依赖注入的问题


            @Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:

例如我把DeptServiceImpl,多复制一份,改名成DeptServiceImpl2

注入的时候,报警告

运行然后报错了


                
        解决方案:

代码:

@Primary
@Primary
@Service
public class DeptServiceImpl2 implements DeptService {

    @Autowired
    private DeptDao deptDao;

  public List<Dept> getList(){
      System.out.println("deptService2,222222");
      List<String> lines = deptDao.list();
      //对元素数据进行处理,组装部门数据
      List<Dept> deptList = lines.stream().map(line ->
              {
                  String[] split = line.split(",");
                  Integer id = Integer.valueOf(split[0]);
                  String name = split[1];
                  LocalDateTime updateTime = LocalDateTime.parse(split[2], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                  return new Dept(id, name, updateTime);
              }
      ).toList();
      return deptList;
  }
}

现在就可以正常运行了

效果:看控制台输出的得知,现在已经用的是 deptServiceImpl2了。

@Qualifoer

在·controller层注入的时候,添加@Qualifier(value="deptServiceImpl")。看控制台输出的得知,现在已经用的是 deptServiceImpl了。

效果:

@Resource

在·controller层注入的时候,添加@Resource(name="deptServiceImpl2")。看控制台输出的得知,现在已经用的是 deptServiceImpl2了。

效果:


            
        @Resource和@Autowired的区别:
  •             @Autowired是Spring框架提供的注解,而@Resource是JavaEE规范提供的
  •             @Autowired默认是按照类型注入,而@Resource默认是按照名称注入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1276070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TZOJ 1386 十转换转R进制

答案&#xff1a; #include<stdio.h> char fun(int n) {if (n > 0 && n < 10) //如果是小于10进制的return n 48; //ASCII值48else if (n > 10 && n < 16) //如果是大于10进制小于16进制的return n 55; //ASCII值55elseretur…

JIRA 基本使用

该页面可以&#xff1a; 查看个人基本信息以及归属的邮件组修改常用参数配置查看指给自己的 Open 问题查看自己最近的活动记录等 权限管理 Project 权限管理 JIRA 项目有三种通用权限方案&#xff1a; 公开权限方案&#xff08;默认禁止使用此方案&#xff09;&#xff1a…

Google Chrome 下载 (离线版)

1 访问网址 Google Chrome 网络浏览器 2 点击 下载Chrome 3 直接运行 ChromeStandaloneSetup64.exe 其他&#xff1a; ####################### 谷歌浏览器 (Google Chrome) 最新版离线安装包下载 https://www.iplaysoft.com/tools/chrome/#google_vignette Google Chrome …

【二叉树】常见题目解析(2)

题目1&#xff1a;104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 题目1描述&#xff1a; 题目1分析及解决&#xff1a; &#xff08;1&#xff09;base case&#xff1a;当前节点为null时&#xff0c;以当前节点为根节点的树最大深度是0。 &#xff08;2&…

深入理解前端路由:构建现代 Web 应用的基石(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

skywalking 9.0.0开启自监控和配置集群

一、skywalking介绍 SkyWalking是有国内开源爱好者吴晟开源并提交到Apache孵化器的开源项目&#xff0c;2017年12月SkyWalking成为Apache国内首个个人孵化项目&#xff0c;2019年4月17日SkyWalking从Apache基金会的孵化器毕业成为顶级项目&#xff0c;目前SkyWalking支持Java、…

如何快速看懂市场行情?

一、看大盘指数 咱们平时所说的大盘其实指的就是上证指数&#xff0c;它是整个市场的晴雨表。大盘涨了&#xff0c;个股跟着上涨的概率就大&#xff0c;大盘跌了&#xff0c;个股被拖累下跌的概率也大。所以&#xff0c;要想在股市中尝到甜头&#xff0c;大盘分析是少不了滴&am…

git的基本命令操作超详细解析教程

Git基础教学 1、初始化配置2、初始化仓库3、工作区域和文件状态4、添加和提交文件5、git reset 回退版本6、git diff查看差异7、删除文件git rm8、.gitignore9、本地文件提交到远程仓库10、分支基础 Git&#xff1a;一个开源的分布式版本控制系统&#xff0c;它可以在本地和远程…

网络安全应急响应-Server2228(环境+解析)

网络安全应急响应 任务环境说明: 服务器场景:Server2228(开放链接)用户名:root,密码:p@ssw0rd123

2023第十二届“认证杯”数学中国数学建模国际赛赛题A完整解析

A题完整题解 写在前面假设数据预处理 问题一1 基于自适应ARIMA-BP神经网络模型的影响因素预测1.1 ARIMA模型的建立1.2 BP神经网络模型的建立1.3 基于GABP神经网络的预测模型构建1.4 自适应混合ARIMA-BP神经网络模型的建立1.5 模型求解 代码Q1_1.mQ1_2.m 完整代码与论文获取 写在…

Android 应用程序无响应定位ANR原因

废话不多说&#xff0c;直接上方案&#xff1a; 第一步&#xff1a; 执行adb命令 adb bugreport /Users/mac/Desktop/anr 解压后FS/data/anr下就会有相关anr文件 /Users/mac/Desktop/anr 是电脑存储文件的路径&#xff0c;可以随便定义&#xff0c;这个没有影响。我的电脑是…

RHCSA学习笔记(RHEL8) - Part2.RH134

Chapter Ⅰ 提高命令行生产率 SHELL脚本 #/bin/bash声明使用的shell翻译器 for循环 for VAR in LIST doCOMMAND1COMMAND2 done实验1&#xff1a;显示host1-5 #! /bin/bash for host in host{1..5} doecho $host done实验2&#xff1a;显示包含kernel的软件包安装时间 #! /…

【微服务 SpringCloudAlibaba】实用篇 · Gateway服务网关

微服务&#xff08;8&#xff09; 文章目录 微服务&#xff08;8&#xff09;1. 为什么需要网关2. gateway快速入门1&#xff09;创建gateway服务&#xff0c;引入依赖2&#xff09;编写启动类3&#xff09;编写基础配置和路由规则4&#xff09;重启测试5&#xff09;网关路由的…

linux 内核工作队列技术原理

首先介绍一下工作队列使用的术语。 work&#xff1a;工作&#xff0c;也称为工作项。work queue&#xff1a;工作队列&#xff0c;就是工作的集合&#xff0c; work queue 和 work 是一对多的关系。worker&#xff1a; 工人&#xff0c; 一个工人对应一个内核线程&#xff0c;…

助力android面试2024【面试题合集】

转眼间&#xff0c;2023年快过完了。今年作为口罩开放的第一年大家的日子都过的十分艰难&#xff0c;那么想必找工作也不好找&#xff0c;在我们android开发这一行业非常的卷&#xff0c;在各行各业中尤为突出。android虽然不好过&#xff0c;但不能不吃饭吧。卷归卷但是还得干…

什么是美颜SDK?市面常用直播美颜SDK的技术比较

直播平台美颜技术其中的核心就是美颜SDK。本文将深入探讨什么是美颜SDK&#xff0c;以及市面上常用的直播美颜SDK的技术比较。 一、美颜SDK简介 美颜SDK&#xff0c;使开发者能够在其应用或平台中集成美颜特效。对于直播平台而言&#xff0c;美颜SDK的引入旨在提供实时、高质…

LabVIEW在调用image.cpp或drawmgr.cpp因为DAbort而崩溃

LabVIEW在调用image.cpp或drawmgr.cpp因为DAbort而崩溃 出现下列问题&#xff0c;如何解决&#xff1f; 1. LabVIEW 程序因image.cpp或drawmgr.cpp中的错误而崩溃 2. 正在通过cRIO-9034运行独立的LabVIEW应用程序&#xff0c;但它因drawmgr.cpp中的错误而崩溃 …

利用reddit的api进行爬虫

1 介绍 Reddit是一个社交新闻聚合网站&#xff0c;用户可以发布、评价和讨论各种话题。Reddit的内容涵盖了广泛的主题&#xff0c;可以从中获取大量的文本数据进行情绪分析。 2 注册 2.1 注册reddit 你需要先注册一个reddit的账号。 2.2 注册api https://www.reddit.com/…

微服务架构:解析分布式系统的演进

目录 微服务是什么&#xff1f; 微服务的优势 微服务的挑战 应对微服务挑战的方法 结论 在当今快速发展的软件开发领域&#xff0c;微服务架构成为一种备受瞩目的设计理念&#xff0c;被广泛应用于构建灵活、可扩展的分布式系统。本文将深入探讨什么是微服务&#xff0c;为…

LeetCode困难题(分发糖果--接雨水)

分发糖果 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回…