Springboot 接口实现

本文介绍了如何在Springboot中设计RESTful风格的接口,包括API端的@Controller实现,Manager端的@Service调用,以及接口文档的设计。详细阐述了签名算法和RestTemplate的使用,用于服务器之间的HTTP请求。此外,还讨论了前后端分离场景下API接口的重要性,以及Controller、Service和Dao层在Springboot项目中的职责分工。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接口可以方便前后端分离,也可以方便他人调用,因此项目进行接口设计是有必要的。Springboot 基于REST 风格快速进行接口设计。

API 端: 设计接口 @RequestMapping(value = "api") @Controller public class ApiController extends BaseController{

@RequestMapping(value = "/getJson.do", method = RequestMethod.POST)
@ResponseBody
public String getJson(){
    // 获取请求数据
    PageData pageData = super.getPageData();
​
    // 封装返回结果
    PageData result = new PageData();
​
    // 签名验证
    if(!DigestUtil.toSign(pageData).equals(pageDat.getString("sign"))){
        result.put("errCode", 100);
        result.put("errMsg", "签名验证失败");
​
        return JsonUtil.getJson(result);
    }
​
    // 获取请求中的参数
    // 比如传递的参数是1 就返回一个list数据,否则返回一个string
    int parameter = pageData.getInt("parameter");
​
    // 根据获得的参数,写处理逻辑,可以与数据库交互,这里模拟一个list返回
    if(parameter == 1){
        // 模拟数据,可以与dao层连接
        List<String> list = new ArrayList<>();
        list.add("clare");
        list.add("tung");
​
        // 参数匹配返回结果
        result.put("data", JsonUtil.listToJson(list));
        result.put("errCode", 0);
        result.put("errMsg", "");
​
        return JsonUtil.getJson(result);
    }
​
    // 其他返回结果
    result.put("data", "Nothing");
    result.put("errCode", 102);
    result.put("errMsg", "请求没有结果");
​
    return JsonUtil.getJson(result);
}

}

Manager 端调用接口

@Service("managerService") public class ManagerService{

public  String getJson(int parameter){
    // 封装请求信息
    PageData htp = new PageData();
    htp.put("version", "1");
    htp.put("r", String.valueOf((int)(Math.random()*100)));
    htp.put("parameter", String.valueOf(parameter));
    // 签名
    htp.put("sign", DigestUtil.toString(htp));
​
    // 发送请求,获得返回数据
    String json = HttpClientUtils.doPost("http://localhost:8100/api/getJson.do", htp);
​
    // 可对数据进行处理
    Map map = JSON.parseObject(json);
​
    // 签名验证失败
    if(map.get("errCode").toString().equals("100")){
        return map.get("errMsg").toString();
    }
​
    // 返回一个字符串,看一下效果
    return json;
}

}

// 接口文档设计 接口文档

API: http://$domain/api/getJson.do

描述: 参数为1 获取一个list

请求参数: 参数 类型 是否必须 说明 version int 是 从1开始 r int 是 随机产生 sign string 是 请求参数签名 paramete int 否 过滤参数

返回结果: 字段 类型 说明 errCode int 0成功 100签名验证失败 102 单据类型不存在

errMsg string "" 或 "签名验证失败" 或 "单据类型不存在"

示例: 请求参数: { "version": 1, "r": 96, "parameter": "1", "sign": "1f4683b239b31676" }

返回结果: { "errCode":0, "errMsg": "", "data":["clare", "tung"] }

补充说明: 签名算法(签名机制是一种安全机制) 对待签名字符串采用MD5进行加密,将加密串全部转换为小写字母,取8位开始的16个字符进行反转,生成最终的签名字符串。

列如生成的MD5串为: 4f445e77fa27d9bcce5cefdb0b9613a2

生成的最终签名为: bdfec5eccb9d72af

Springboot RestTemplate 服务器端之间http 请求restful 服务接口

restTemplate 底层是基于HttpURLConnection 实现的restful 风格的接口调用,类似于webservice, rpc 远程调用,但是其工作模式更加轻量级,方便于rest请求之间的调用,完成数据之间的交互。 分别为 get 请求方法、post 请求方法、put 请求方法、delete请求方法和exchange 请求方法

RestTemplate 使spring 能够方便的使用rest 资源,它定义了许多与rest交互分方法,并且对应大多数http 请求方法,可以使用exchange() 方法完成请求。 exchange() 是在URL 上执行特定的 HTTP 方法,完成请求。

 

#

网络程序正朝着移动设备的方向发展,前后端分离、APP,最好的交互方式是通过API 接口实现。既要进行数据交互,又要使用方便,优雅好看。 返回格式: API 接口的返回方式: application/json Springboot 开发过程中,每层个代表的含义:接下来讲解每个层所实现的功能,并通过代码实现,以表达最终含义。 Controller 层: 专注于请求处理以及请求参数的接收,同时会调用service层中实现好的方法, 具体代码如下: @Controller public class TestController{

 /**
 * 注入service类
 */
 @Autowired
 private TestService testService;
 /**
 * 前端分别传入各类信息,testUrl, project, pageSize, offset, sort, sortOrder参数
 * 注意:@RequestParm(value = "project", required = false) 表示接收到的project 参数赋值给了形参project, request=false 表示该参数可传可不传,如果没有改参数,就必须传入,不然就会报错
 */
 @RequestMapping(value="getTest", method=RequestMethod.GET)
 public @ResponseBody Map<String, Object> getTest(@RequestParam(value="address", required=false) String testUrl,
 @RequestParam(value="addressproject", required=false) String project, int pageSize, int offset, String sort, String sortOrder){
​
     Map<String, Object> map = null;
     map = testService.selectAllTest(testUrl, project, pageSize, offset, sort, sortOrder);
​
     return map;
​
 }

} Service 层 Service 层主要实现业务逻辑层,是最重要的一部分,夹在Controller 和 Dao 层之间。

@Service public interface TestService{

  Map<String, Object> selectAllTest(String testUrl, String project, int pageSize, int offset, String sort, String sortOrder);

}

/**

  • @Service 注解声明此类service层,赋值为TestService,以便注入到Controller 中 * */ @Service(value = "testService") public class TestServiceImpl implements TestService{

    @Autowired private TestDao testDao;

    @Override public Map<String, Object> selectAllTest(String testUrl, String project, int pageSize, int offset, String sort, String sortOrder){

    Map<String, Object> page = new HashMap<String, Object>();
    Map<String, Object> content1 = new HashMap<String, Object>();
    Map<String, Object> content2 = new HashMap<String, Object>();
    count1.put("testUrl", testUrl);
    count1.put("project", project);
    count1.put("pageSize", pageSize);
    count1.put("offest", offest);
    count1.put("sort", sort);
    count1.put("sortOrder", sortOrder);
    // 添加信息
    List<TestModel>  testList = testDao.SelectAllTest(content1);
    count2.put("testUrl", testUrl);
    count2.put("project", project);
    int total = testDao.countApiList(count2);
    page.put("data", testList);
    page.put("total", total);
    ​
    return page;

    } }

Dao 接口, 用于数据库的交互

/**

  • Mapper注解 */ @Mapper public interface TestDao{

    /**

    • 根据项目id 查询关联的 test

    • @param proid

    • @return */

    List<TestModel> selectAllTest(Map<Sting, Object> count);

    int countApiList(Map<String, Object> count2); }

Mapper.xml 文件

<sql id="table"> t_test </sql> <!-- 创建行、表命名 --> <sql id="column"> frowid, faid, fproid, fapiiname, faurl, ftype, fcounttype, fcasenum, fcreatetime, fupdatetime </sql>

<sql id="updatecolum"> faid, fproid, fapiname, faurl, ftype, fcounttype, fcasenum. fcreatime, fupdatetime </sql>

<!-- 选择语句 -->

  SELECT FROM AND faurl like CONCAT("%", #{apiTest},"%")

    <if test="project != null">
        AND project like CONCAT("%", #{project}, %)
    </if>
</where>
    ORDER BY #{sort} #{sortOrder} LIMIT #{start},#{pageSize}

</select>

  SELECT count(*)  FROM AND faurl like CONCAT("%", #{apiTest},"%")

    <if test="project != null">
        AND project like CONCAT("%", #{project}, %)
    </if>
</where>

</select>

以上为接口设计的各个部件信息。

controller service dao (mapper) entity mapper.xml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值