SSM框架之RestFul示例

简介: 演示环境:maven+Spring+SpringMVC+MyBatis Plus或MyBatis都行+JDK8JDK7我想应该没有问题,原因是用的基本都是JDK6或者JDK7的相关特性。当然了,JDK10现在都有了,新的特性出现的同时和对一些原有的JAVA类性能升级等。

演示环境: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

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

 

目录
相关文章
|
18天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
33 4
|
1天前
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
15 3
|
2月前
|
JSON Go API
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
使用Go语言和Gin框架构建RESTful API:GET与POST请求示例
|
18天前
|
存储 前端开发 API
Restful API 设计示例
Restful API 设计示例
25 0
|
2月前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
67 1
|
2月前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
63 2
|
2月前
|
XML Java 数据库连接
如何搭建SSM框架、图书商城系统
这是一份详尽的《Spring + SpringMVC + Mybatis 整合指南》,作者耗时良久整理出约五万字的内容,现已经全部笔记公开。此文档详细地介绍了如何搭建与整合SSM框架,具体步骤包括创建Maven项目、添加web骨架、配置pom文件以及整合Spring、SpringMVC和Mybatis等。无论是对初学者还是有一定基础的开发者来说,都是很好的学习资源。此外,作者还提供了项目源码的GitHub链接,方便读者实践。虽然当前主流推荐学习SpringBoot,但了解SSM框架仍然是不可或缺的基础。
29 0
|
3月前
|
开发者 Java UED
大文件传输不再头疼:揭秘Struts 2如何轻松应对文件上传与下载难题!
【8月更文挑战第31天】在Web应用开发中,文件上传与下载至关重要。Struts 2作为主流Java EE框架,凭借Commons FileUpload及文件上传拦截器简化了相关操作。本文探讨Struts 2在文件传输上的优势,通过具体配置与代码示例,展示如何设置最大文件大小、使用`fileUpload`拦截器以及实现文件上传与下载功能。对于大文件传输,Struts 2不仅能够轻松应对,还支持上传进度显示,有效提升了用户体验。总体而言,Struts 2为文件传输提供了高效便捷的解决方案,助力开发者构建稳定可靠的Web应用。然而,在处理大文件时需兼顾网络带宽与服务器性能,确保传输顺畅。
58 0
|
3天前
|
前端开发 关系型数据库 API
深入浅出后端开发——从零到一构建RESTful API
本文旨在为初学者提供一个关于后端开发的全面指南,特别是如何从零开始构建一个RESTful API。我们将探讨后端开发的基本概念、所需技术栈、以及通过实际案例展示如何设计和实现一个简单的RESTful API。无论你是完全的新手还是有一定编程基础的开发者,这篇文章都将为你提供实用的知识和技巧,帮助你在后端开发的道路上迈出坚实的一步。
|
3天前
|
XML API 网络架构
深入理解RESTful API设计原则与实践
【10月更文挑战第26天】在数字化浪潮中,API(应用程序编程接口)成为连接不同软件组件的桥梁。本文将深入浅出地探讨如何根据REST(Representational State Transfer)原则设计高效、易于维护和扩展的API,同时分享一些实用的代码示例,帮助开发者构建更加健壮和用户友好的服务。