接口可以方便前后端分离,也可以方便他人调用,因此项目进行接口设计是有必要的。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