演示环境:maven+Spring+SpringMVC+MyBatis Plus或MyBatis都行+JDK8

JDK7我想应该没有问题,原因是用的基本都是JDK6或者JDK7的相关特性。

当然了,JDK10现在都有了,新的特性出现的同时和对一些原有的JAVA类性能升级等。

RestFul是一种架构风格,对应资源请求分门别类管理。

万物皆资源,可以这么理解。

对应不同的请求有不同的请求方式,比如

如果是获取资源列表,可通过GET请求获取对应的资源列表信息;

如果是删除某个资源,可以使用Delete请求;

如果是修改某个资源,可以使用Put请求;

如果是增加某个资源,可以使用POST请求;

日常比较常用的也就这么几个,对于SpringMVC,你可以尽情的使用注解,例如@PostMapping、@GetMapping、@PutMapping、@DeleteMapping等。

同时也可以使用@RequestMapping中的Method定义呢需要的请求方式。当然了,我个人比较推崇使用对应的请求注解。

如果按照之前的方式开发,很少分请求对应资源。

另外,或许有人疑问为什么要这样做?

前面我就说过,为了更好的管理资源,遵守RestFul架构风格。

当然了,还有就是用请求可以区分资源,例如获取、增加、删除、修改等。当然了,全部用Post也可以做。至于为什么用Post,网上博客一大把。

至于Delete、PUT,它们都和Post一样,不能通过F12获取具体的信息,除非通过POSTMAN或Jmeter等工具可以获取,再不济使用Java封装的一个HTTP类也可以做到。

使用GET的目的因为,通过GET获取数据只是查而已,并不对数据修改,对于安全性而言的话,没那么高。而Delete、Post、Put的话,对于数据库直接涉及删、增、改了,所以一定要特别注意安全性方面。

下面演示了几个示例:

1.GET

/**
* 查询公司编码获得该公司相关的所有资源
* @param companyCode
* @return
*/
@GetMapping(value="/selectCompanyCodeGetResourceInfo",produces="application/json;charset=utf-8")
@ApiOperation(value="查询公司编码获得该公司相关的所有资源",httpMethod="GET",notes="获取资源状态数量信息,个体用户专用")
public JSONObject selectCompanyCodeGetResourceInfo(String companyCode,String status){
JSONObject json = new JSONObject(); System.out.println("companyCode:"+companyCode);
System.out.println("status:"+status);
//条件查询
EntityWrapper<Resource> resourceSelectCondition = new EntityWrapper<Resource>();
resourceSelectCondition.eq("company_code", companyCode);
resourceSelectCondition.eq("status", status);
List<Resource> resourceList = resourceService.selectList(resourceSelectCondition); if(status.equals(CommonEnum.ISSUE)) {
json.put("resourceList",resourceList);
json.put("returnMsg", CommonEnum.ISSUE);
}else if(status.equals(CommonEnum.NO_ISSUE)) {
json.put("resourceList",resourceList);
json.put("returnMsg", CommonEnum.NO_ISSUE);
}else {
json.put("resourceList",resourceList);
json.put("returnMsg","error");
} return json; }

js代码

//查询公司编码获得该公司相关的所有资源
function selectCompanyCodeGetResourceInfo(companyCode,status){
$.ajax({
url:ZL.url.api.selectCompanyCodeGetResourceInfo,
type:"GET",
data : {"companyCode":companyCode,"status":status},
dataType : 'json',
success:function(data){ //将从后台获取的List装入apps中
var apps = data.resourceList; new Vue({
el:"#markingCenter",
data:
{
items:apps
}
}); },error:function(){
alert("失败");
}
}); }

2.POST

    /**
* 个人身份认证
* @param personAuthDto
* @return
*/
@PostMapping(value="/personal_Auth",produces="application/json;charset=utf-8")
@ApiOperation(value="个人身份认证",httpMethod="POST",notes="个人身份认证")
public JSONObject personal_Auth(@RequestBody PersonAuthDto personAuthDto) { JSONObject json = new JSONObject(); logger.info("---start---");
logger.info("userId:"+personAuthDto.getUserId());
logger.info("identity:"+personAuthDto.getIdentity());
logger.info("remark:"+personAuthDto.getRemark());
logger.info("---end---");
//身份证合法验证
boolean validIdentity = IdcardUtil.isValidCard(personAuthDto.getIdentity()); if(validIdentity) { try { Date date = DateUtil.date();
MarketIdentity auth = new MarketIdentity();
auth.setUserId(personAuthDto.getUserId());
auth.setCreateTime(date.toString());
auth.setIdentityId(personAuthDto.getIdentity());
auth.setRemark(personAuthDto.getRemark());
auth.setType(CommonEnum.PERSON_AUTH);
auth.setResult(CommonEnum.WAIT_AUTH); //调用新增认证信息方法
boolean isAuth = marketIdentityService.insert(auth); if(isAuth) { json.put("returnMsg","已提交认证申请,等待审批");
json.put("returnCode","000000"); }else { json.put("returnMsg","提交认证申请失败");
json.put("returnCode","111111");
} }catch (Exception e) { e.printStackTrace(); json.put("returnMsg","其他异常");
json.put("returnCode","222222");
} }else { json.put("returnMsg","身份证认证不合法");
json.put("returnCode","333333");
} return json; }

js代码

$(function(){

    $("#personal_auth").click(function(){
var userId = $("#userId").val();
var identity = $("#person_identity").val();
var remark = $("#person_remark").val();
var data = {
userId:userId,
identity:identity,
remark:remark
} if(remark==null || remark==""){
layui.use('layer', function(){
var layer = layui.layer; layer.msg("请填写认证理由",{icon: 5});
}); return false;
}else{
$.ajax({
url :ZL.url.api.personal_Auth,
type : "POST",
contentType: 'application/json;charset=utf-8',
data : JSON.stringify(data),
dataType : 'json',
success : function(data){ if(data.returnCode=="000000"){
layui.use('layer', function(){
var layer = layui.layer; layer.msg(data.returnMsg,{icon: 1});
});
setTimeout(() => {
closeLayui();
}, 800);
}else if(data.returnCode=="111111"){
layui.use('layer', function(){
var layer = layui.layer; layer.msg(data.returnMsg,{icon: 5});
});
}else if(data.returnCode=="222222"){
layui.use('layer', function(){
var layer = layui.layer; layer.msg(data.returnMsg,{icon: 5});
});
}else if(data.returnCode=="333333"){
layui.use('layer', function(){
var layer = layui.layer; layer.msg(data.returnMsg,{icon: 5});
});
} },
error:function(XMLHttpRequest, textStatus, errorThrown){
alert(XMLHttpRequest.status);
// 状态
alert(XMLHttpRequest.readyState);
// 错误信息
alert(textStatus); }
}); return true;
} });
});

3.DELETE

@DeleteMapping(value="test002")
public JSONObject test002(String userCode) {
JSONObject json = new JSONObject();
logger.info("userCode:"+userCode);
boolean b = userService.deleteById(userCode);
if(b) {
json.put("returnMsg", "success");
json.put("returnCode", "00000");
}else {
json.put("returnMsg", "error");
json.put("returnCode", "111111"); } return json;
}

js代码

    var userCode="5";
$.ajax({
url:"sysUser/test002",
type:"DELETE",
data:{"userCode":userCode},
dataType : 'json',
success:function(data){
alert(data.returnCode);
},error:function(XMLHttpRequest, textStatus, errorThrown){
alert(XMLHttpRequest.status);
// 状态
alert(XMLHttpRequest.readyState);
// 错误信息
alert(textStatus);
}
});

4.PUT

@PutMapping(value="test002")
public JSONObject test002(@RequestBody SysUser sysUser) {
JSONObject json = new JSONObject();
boolean b = userService.updateById(sysUser);
if(b) {
json.put("returnMsg", "success");
json.put("returnCode", "00000");
}else {
json.put("returnMsg", "error");
json.put("returnCode", "111111"); } return json;
}

js代码

var data = {
userCode:"2",
loginCode:"123456"
} $.ajax({
url:"/sysUser/test002",
type:"PUT",
contentType: 'application/json;charset=utf-8',
data:JSON.stringify(data),
dataType : 'json',
success:function(data){
alert(data.returnCode);
},error:function(XMLHttpRequest, textStatus, errorThrown){
alert(XMLHttpRequest.status);
// 状态
alert(XMLHttpRequest.readyState);
// 错误信息
alert(textStatus);
}
});

另外补充说说403、415、500和ajax错误

ajax错误:

出现这个错误的原因,很简单语法错误,不过越简单有的时候往往容易犯低级错误,不过通过浏览器f12调试即可。特别是中小型公司的朋友们,往往兼任多个职位,又是前端,又是后端还有兼任测试和运维。

掌握合理的调试技巧和方式,另外还有有一点要注意,单元测试和POSTMAN或Jmeter测试一定要及时,这样真的可以避免很多问题的。

2.关于这个403

403问题通常是跨域请求问题,下面这个链接可以作为解决方案:

https://blog.csdn.net/qq_25152183/article/details/53158222

3.415错误码

这个错误码出现的原因是比如,我要修改某条数据时,我前端ajax不存在一个叫contentType: 'application/json;charset=utf-8'和使用这个方法JSON.stringify(data),而后台却加上了一@RequestBody,这个注解也就声明了你前台传的必须是json,否则会出现这个问题

4.500

500的问题多的多,这里只列举空指针,这个空指针问题,还是源于修改,前台加上了contentType: 'application/json;charset=utf-8'和使用这个方法JSON.stringify(data),但后台却没有加上@RequestBody,导致参数无法接收,从而导致空指针。通常情况下,用@RequestBody修饰对象。如果只是简单的三个以内或者三个参数可以直接使用{"param1":param1,"param2":param2,"param3":param3}这种方式,如果多于三个以上建议使用数据传输对象的形式,即DTO。

小结:

时不时,还是要抽点时间学习学习理论方面的,读读一些国外有名的计算机博士文章,虽然说不一定完全读的明白,但是可以开开眼界,或者从某些片段中会有一些意想不到的收获。

RestFul架构风格论文:https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm

大家有时间可以读读,读完后,说不定看看其他的博友们分享的相关文章,会有一种非常特别的感觉。

SSM框架之RestFul示例的更多相关文章

  1. Java基于ssm框架的restful应用开发

    Java基于ssm框架的restful应用开发 好几年都没写过java的应用了,这里记录下使用java ssm框架.jwt如何进行rest应用开发,文中会涉及到全局异常拦截处理.jwt校验.token ...

  2. SSM框架之批量增加示例(同步请求jsp视图解析)

    准备环境:SSM框架+JDK8/JDK7+MySQL5.7+MAVEN3以上+Tomcat8/7应用服务器 示例说明: 分发给用户优惠券,通过checkbox选中批量分发,对应也就是批量增加. 对于公 ...

  3. java web后台开发SSM框架(Spring+SpringMVC+MyBaitis)搭建与优化

    一.ssm框架搭建 1.1创建项目 新建项目后规划好各层的包. 1.2导入包 搭建SSM框架所需包百度云链接:http://pan.baidu.com/s/1cvKjL0 1.3整合spring与my ...

  4. SSM框架搭建web服务器实现登录功能(Spring+SpringMVC+Mybatis)

    初学java EE,虽然知道使用框架会使开发更加便捷高效,但是对于初学者来说,感到使用框架比较迷惑,尤其是各种jar包的引用.各种框架的配置.注解的使用等等. 最好的学习方法就是实践,于是下载了一个现 ...

  5. 整合最优雅SSM框架:SpringMVC + Spring + MyBatis

    我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...

  6. 手把手教你 基础 整合最优雅SSM框架:SpringMVC + Spring

    我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...

  7. SSM框架开发web项目系列(二) MyBatis真正的力量

    前言 上篇SSM框架环境搭建篇,演示了我们进行web开发必不可少的一些配置和准备工作,如果这方面还有疑问的地方,可以先参考上一篇“SSM框架开发web项目系列(一) 环境搭建篇”.本文主要介绍MyBa ...

  8. SSM框架开发web项目系列(三) MyBatis之resultMap及关联映射

    前言 在上篇MyBatis基础篇中我们独立使用MyBatis构建了一个简单的数据库访问程序,可以实现单表的基本增删改查等操作,通过该实例我们可以初步了解MyBatis操作数据库需要的一些组成部分(配置 ...

  9. SSM框架开发web项目系列(五) Spring集成MyBatis

    前言 在前面的MyBatis部分内容中,我们已经可以独立的基于MyBatis构建一个数据库访问层应用,但是在实际的项目开发中,我们的程序不会这么简单,层次也更加复杂,除了这里说到的持久层,还有业务逻辑 ...

随机推荐

  1. 一文告诉你 Event Loop 是什么?

    Event Loop 也叫做"事件循环",它其实与 JavaScript 的运行机制有关. JS初始设计 JavaScript 在设计之初便是单线程,程序运行时,只有一个线程存在, ...

  2. Fastify 系列教程二 (中间件、钩子函数和装饰器)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) Fastify ...

  3. nodejs做的一个测试端口程序

    最近在学习nodejs的http,然后做了一个测试域名有没有使用那些端口,原意是用来做一个本地的静态服务器,然后运行前先测试端口,首先要用到的是net模块,主要用到的是Socket,判断其连接状态即可 ...

  4. Vmware搭建LNMP环境(Centos7+Nginx+Mysql+PHP7.1.8)

    参考:1.Linux学习之CentOS(一)----在VMware虚拟机中安装CentOS 7(图文教程) 2.Centos7搭建LNMP环境 3.MySQL5.7修改默认root密码 4.CentO ...

  5. html--对URL传参数进行解析

    跳转页面需要传参数到另外一个html页面,跳转链接可写一个js的function function doView(articleId) { window.location.href ="co ...

  6. 3.如何在Maven项目中引入自己的jar包

    1.一般情况下jar包都可以使用pom.xml来配置管理,但也有一些时候,我们项目中使用了一个内部jar文件,但是这个文件我们又没有开放到maven库中. 我们会将文件放到我们项目中.(以下以java ...

  7. Prometheus Node_exporter 之 Basic CPU / Mem / Disk Gauge

    1. CPU Busy :收集所有 cpu 内核 busy 状态占比 type: SinglestatUnit: perent(0-100)(所有 cpu使用情况 - 5分钟内 cpu 空闲的平均值) ...

  8. Paxos可容错的一致性协议

    一致性问题要求多个process对一个值达成一致.基于消息传递的分布式系统中,在不考虑消息篡改等拜占庭错误的情况下,Paxos可以解决在进程退出,消息延迟,丢失,重复等异常发生的环境中对某个值达成一致 ...

  9. 分享:Windows2008重启后提示系统恢复选项的解决办法

    如题:WINdows2008服务器. 重启后提示系统恢复选项的解决办法 使用windows 2008后,不能启动的问题,重启后出现 修复系统选项 采用下面帖子中的部分命令搞定之. 我自己是直接使用:选 ...

  10. Oracle EBS 获取用户挂的职责 请求 请求的类别(RTF还是什么的)

    select fu.user_ID, fu.user_name, fu.start_date, fu.END_DATE, fu.description, fe.last_name, fr.RESPON ...