演示环境: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. Java 源程序与编译型运行区别

  2. [js高手之路]Node.js模板引擎教程-jade速学与实战1-基本用法

    环境准备: 全局安装jade: npm install jade -g 初始化项目package.json: npm init --yes 安装完成之后,可以使用 jade --help 查看jade ...

  3. 从敲入 URL 到浏览器渲染完成、对HTTP协议的理解

    1. 大致过程 当你这样子回答的时候: 用户输入 url 地址,浏览器查询 DNS 查找对应的请求 IP 地址 建立 TCP 连接 浏览器向服务器发送 http 请求,如果服务器段返回以 301 之类 ...

  4. Atitit.resin  could not create the java virtual machine问题

    Atitit.resin  could not create the java virtual machine问题 1. 正常的参数是这样1 2. 错误的cmd运行时候的参数1 3. 输出2 4. 原 ...

  5. Flutter与Android混合开发及Platform Channel的使用

    相对于单独开发Flutter应用,混合开发对于线上项目更具有实际意义,可以把风险控制到最低,也可以进行实战上线.所以介绍 集成已有项目 混合开发涉及原生Native和Flutter进行通信传输,还有插 ...

  6. gitlab的仓库迁移到新的gitlab

    1.下载原有gitlab源码 git clone http://gitlab.**.com/projectName gitlab地址替换成为新gitlab地址 git remote set-url o ...

  7. 【日常记录】【unity3d】 OnTriggerEnter 和 OnCollisionEnter (2D) 的区别

    问题:两个物体A,B 两者都有碰撞体 collider(Box Collider,Sphere Collider,Capsule Collider等)当两物体相撞时,会进入 OnTriggerEnte ...

  8. 转载:http://www.cnblogs.com/double-K/p/6926367.html

    sql专家感悟:不可说的感悟-——十年老技术转型(一) http://www.cnblogs.com/double-K/p/6926367.html

  9. Ubuntu-18.04 下修改root用户密码,安装SSH服务,允许root用户远程登录,安装vsftp服务器

    修改root用户密码 打开终端,输入 sudo passwd root 指令: 安装SSH服务 ssh默认端口号是22,可以在/etc/ssh/sshd_config文件中修改 查看服务器否开启:ne ...

  10. Vue2学习笔记:html属性

    1.使用 <!DOCTYPE html> <html> <head> <title></title> <meta charset=&q ...