RESTful风格的应用(一)

简介: RESTful风格的应用

一.开发第一个RESTful应用


本节讲解一个全新的话题,RESTful开发风格。

REST :全称Representational State Transfer(表现层状态转换),资源在网络中,以某种表现形式进行状态转移。听起来很难理解,其实说白了就是在我们web环境下,如果你要获取某个图片,js,网页这些资源的时候,就要以url的形式进行表现。我们访问一个图片的网址,那这个资源返回的就自然是一张图片,如果访问的是一个CSS,那返回的就是一个CSS。好像这种设计理念对于我们的web应用来说是在再基础不过的东西。其实这是rest给我们提出来的一个设计理念,在web环境以URL的方式,来进行资源的传递。那么基于这种REST的理念,注意,是理念,不是具体的实现。


RESTful是基于REST理念的一套开发风格,是具体的开发规则。 下面通过一个图来进行解释:


4015bb7272bf45328b69c5ade69a0ee1.png


在这个图的最左侧,我们的客户端已经不再是标准的浏览器了,而是包含了像iPhone和安卓系统里所运行的小程序和app,都是可以作为客户端来使用的。而RESTful开发风格下,我们也并不拘泥于客户端必须是浏览器。那客户端和服务器之间如何交互呢?在这里,我打个比方。比如iPhone中有一个小程序向这个URL发送了一个请求,而这个请求被发送到了web端的服务器,那请求在被处理了以后,关键的区分来了,作为服务器端返回的已经不再是某一个HTML的文本,而是像json或是xml这样的数据。作为RESTful最典型的特征就是,我们服务器端只返回数据 ,这种数据以json或者是xml的方式进行体现。同时返回的数据要求不包含任何与展现相关的内容。当这些数据被送回到客户端以后,再由客户端对这些数据进行渲染和展现。比如我们PC端的浏览器接收到这个JSON以后,可能是以一个表格的形式在浏览器中进行展现,而iPhone或者安卓这种移动端的小屏幕的话,它可能会以滑动列表的形式进行展现。那如何展现呢?这就是客户端的事情了。作为服务器,我不管你客户端使用的是小程序,app还是浏览器,只管专注产生数据就行了,至于数据以什么形式展现出来,那是客户端的事情。这样做最大的好处就是我们开发服务器的后端工程师,只用专注数据,不用关注任何展现。而前端的每一个工程师也不用去关注后台是如何产生数据的。只需要拿到这个字符串进行解析就可以了。在开发的过程中,前端的工程师和后端的工程师可以同步进行,只要我们约定好传递字符串的格式和url就可以了。通过基于RESTful开发风格所编写的程序在行业中还有一个名词叫做前后端分离。前端只负责界面开发,后端只需要专注于业务逻辑就可以了。


RESTful开发规范


1.使用URL作为用户交互入口。


2.明确的语义规范(GET | POST | PUT | DELETE)

这里的语义规范是指在http发送请求的时候,例如get请求或post请求他们自己所实现的含义是有所不同的。在我们日常开发中最常用的http发送的方式有四种GET 、 POST 、PUT 、DELETE。但是后两者我们几乎没有见过,那是为什么呢?是因为在web环境下,只支持get或post请求,不支持put和delete请求。所以我们之前写代码看不到这两种请求。但是看不到,并不代表没有。作为REST在进行语义规范定义的时候,get、post、put、delete其实分别对应了查询操作、新增操作、更新操作、删除操作。也就是说,同一个URL在向服务器发送请求的时候,使用了不同的请求方式,那他在服务器端进行的处理是不一样的。例如你发送一个get请求到服务器端,那程序按照RESTful开发规范,就必须只是一个查询操作,返回请求所对应的数据。那如果是post请求,post对应的是新增操作,那在服务器端的controller中,就要完成对某个数据的新增操作。而put就是数据的更新操作,delete是删除操作。通过遵循RESTful开发规范,当我们看到这个请求的类型的时候,我们就找到要做增删改查的哪一种了。


3.只返回数据(json | xml) ,不包含任何展现。 也就是指在我们服务器产生的数据通常是以json字符串或者xml字符串。日常开发中,优先推荐返回json数据,因为json数据无论是从可读性,还是解析的角度都要比xml简单得多。并且json天然地被JavaScript支持,使用起来更方便。因此主流地web框架,比如说SpringBoot , SpringMVC它都是默认对json提供了良好的支持。


下面举一个例子来举例一下,RESTful怎么写是对的,怎么写是错的。


RESTful命名要求


abb1b85bb10b469fa038b0b33d691409.png


菜鸟教程也有关于RESTful的相关文章:https://www.runoob.com/w3cnote/restful-architecture.html


开发第一个RESTful应用


创建一个普通的maven项目,按照以前的规范导入web模块后,然后在pom.xml中导入springmvc的依赖:


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.13</version>
        </dependency>


然后配置web.xml。在里面配置DispatcherServlet和CharacterEncodingFilter,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载applicationContext.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
        <!--在web应用启动时,自动创建Spring IoC容器,并初始化DispatcherServlet-->
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--"/"代表要拦截所有的请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--将请求的字符集转换为UTF-8,CharacterEncodingFilter比DispatcherServlet优先执行-->
    <filter>
        <filter-name>characterFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterFilter</filter-name>
        <!--对所有的请求进行过滤-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>


配置applicationContext.xml:


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.1.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
    <!--自动扫描组件,自动扫描符合条件的bean-->
    <context:component-scan base-package="com.haiexijun.restful"></context:component-scan>
    <!--启用Spring MVC的注解开发模式-->
    <mvc:annotation-driven>
        <!--配置消息转换器,让响应输出到浏览器以后,以text/html;charset=utf-8输出,解决html里面的中文乱码问题-->
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=utf-8</value>
                        <value>application/json;charset=utf-8</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!--将图片/JS/CSS等静态资源排除在外,可提高执行效率-->
    <mvc:default-servlet-handler/>
</beans>


在com.haiexijun.restful包下创建controller控制器包,并在包下面创建一个全新的java类RestfulController。然后书写如下的代码:


package com.haiexijun.restful.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/restful")
public class RestfulController {
    @GetMapping("request")
    @ResponseBody
    public String doGetRequest(){
        //注意这里模拟返回一个json字符串
        return "{\"message\":\"返回查询结果\"}";
    }
}


到这里,一个RESTful风格的程序就写好了。你可能会有疑问,这不就是我之前学习过的东西吗?他怎么就是RESTful呢?其实,restful解释一种编码的风格,不是一种新的技术。作为restful我们要求,url所有的部分都是名词,除此以外返回的数据也要求是一个json,或者是一个xml格式的数据。同时get、post、put、delete这四种请求也有不同的涵义。上面定义get请求,我们返回的就是查询的结果。


运行结果如下:


9f8e226b028f4a0495b7f4ba21c99748.png


html可以通过ajax技术来使用这个json数据。下面继续来开发restful。来模拟一下客户端页面与restful交互的过程.


二.RESTful基本使用


上一节开发了一个Controller,实现了标准的RESTful风格,本节就来开发html的客户端与服务器端的RESTful进行交互。


返回刚才的工程,在webapp目录下放入jquery.js 文件。等下要用到它来完成Ajax的请求。然后创建一个标准的html页面,这里我叫做index.html。index.html编写如下代码?


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>RESTful</title>
    <script src="jquery.js"></script>
    <script>
        $(function (){
            $("#btnGet").click(function (){
                $.ajax({
                    url:"/restful/request",
                    type:"get",
                    dataType:"json",
                    success:function (data){
                        $("#message").text(data.message)
                    }
                })
            })
        })
    </script>
</head>
<body>
<input type="button" id="btnGet" value="发送Get请求">
<h1 id="message"></h1>
</body>
</html>


运行后点击按钮获取数据:


57e79dfccf5f4113a4469b26ec68ef9e.png


下面在程序中体验一下post等其他请求,在controller中添加如下代码:

这里mapping都为request其实问题不大,因为请求的方式不同。


    @PostMapping("/request")
    @ResponseBody
    public String doPostRequest(){
        return "{\"message\":\"数据新建成功\"}";
    }
    @PutMapping("/request")
    @ResponseBody
    public String doPutRequest(){
        return "{\"message\":\"数据更新成功\"}";
    }
    @DeleteMapping("/request")
    @ResponseBody
    public String doDeleteRequest(){
        return "{\"message\":\"数据删除成功\"}";
    }


当然,这里只是为了方便学习写成这样的,真正开发肯定不是这样写的。在html中更改ajax的http请求类型就可以了,这里不进行测试了。


相关文章
|
1月前
|
XML JSON API
深入浅出:RESTful API 设计实践与最佳应用
【9月更文挑战第32天】 在数字化时代的浪潮中,RESTful API已成为现代Web服务通信的黄金标准。本文将带您一探究竟,了解如何高效地设计和维护一个清晰、灵活且易于扩展的RESTful API。我们将从基础概念出发,逐步深入到设计原则和最佳实践,最终通过具体案例来展示如何将理论应用于实际开发中。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的指导和灵感。
|
3月前
|
Java 缓存 数据库连接
揭秘!Struts 2性能翻倍的秘诀:不可思议的优化技巧大公开
【8月更文挑战第31天】《Struts 2性能优化技巧》介绍了提升Struts 2 Web应用响应速度的关键策略,包括减少配置开销、优化Action处理、合理使用拦截器、精简标签库使用、改进数据访问方式、利用缓存机制以及浏览器与网络层面的优化。通过实施这些技巧,如懒加载配置、异步请求处理、高效数据库连接管理和启用GZIP压缩等,可显著提高应用性能,为用户提供更快的体验。性能优化需根据实际场景持续调整。
71 0
|
3月前
|
JSON API 数据库
探索FastAPI:不仅仅是一个Python Web框架,更是助力开发者高效构建现代化RESTful API服务的神器——从环境搭建到CRUD应用实战全面解析
【8月更文挑战第31天】FastAPI 是一个基于 Python 3.6+ 类型提示标准的现代 Web 框架,以其高性能、易用性和现代化设计而备受青睐。本文通过示例介绍了 FastAPI 的优势及其在构建高效 Web 应用中的强大功能。首先,通过安装 FastAPI 和 Uvicorn 并创建简单的“Hello, World!”应用入门;接着展示了如何处理路径参数和查询参数,并利用类型提示进行数据验证和转换。
91 0
|
4月前
|
SQL API 网络架构
Pythoner必看!RESTful API设计秘籍,让你的Web应用瞬间高大上!
【7月更文挑战第24天】在 Python Web 开发中, RESTful API 设计至关重要, 它不仅展现技术实力, 更提升应用的可维护性与用户体验。
46 5
|
4月前
|
JSON API 网络架构
颠覆传统!Python RESTful API设计与实现,让你的Web应用焕发新生!
【7月更文挑战第22天】了解RESTful API为何重要,它简化了Web服务接口并促进了前后端分离。Python开发者可选Flask或Django REST Framework来构建API。设计时注重资源导向、无状态和统一接口。以下是一个使用Flask创建图书管理API的简例,展示了如何通过HTTP方法处理资源操作。本文旨在帮助读者掌握Python RESTful API开发,鼓励创新与实践。
50 0
|
5月前
|
API Python JSON
使用django创建简单restful应用接口的步骤
【6月更文挑战第2天】本文简介使用Django创建API服务涉及安装djangorestframework,创建api应用,定义URL路由,编写视图和序列化器。这个过程展示了如何用Django Rest Framework构建JSON格式的API。
50 2
|
6月前
|
机器学习/深度学习 算法 安全
深度学习在图像识别中的应用与挑战构建高效可扩展的RESTful API:后端开发的实战指南
【4月更文挑战第30天】 随着计算机视觉技术的飞速发展,深度学习在图像识别领域取得了显著的成果。本文将探讨深度学习技术在图像识别中的应用及其所面临的挑战。首先,我们将介绍深度学习的基本原理和关键技术,然后分析其在图像识别中的优势和应用案例。最后,我们将讨论当前深度学习在图像识别领域所面临的主要挑战和未来的发展趋势。
|
6月前
|
缓存 API 数据库
构建高效Python Web应用:Flask框架与RESTful API设计原则
【5月更文挑战第20天】 在现代Web开发中,构建一个轻量级且高效的后端服务至关重要。本文将深入探讨如何使用Python的Flask框架结合RESTful API设计原则来创建可扩展和易于维护的Web应用程序。我们将通过分析Flask的核心特性,以及如何利用它来实现资源的合理划分、接口的版本控制和请求处理优化等,来指导读者打造高性能的API服务。文中不仅提供了理论指导,还包括了实践案例,旨在帮助开发者提升开发效率,并增强应用的稳定性和用户体验。
|
6月前
|
JSON 安全 API
Flask-Login与Flask-RESTful:扩展你的应用功能
【4月更文挑战第16天】本文介绍了两个实用的Flask扩展——Flask-Login和Flask-RESTful。Flask-Login提供用户认证和会话管理,简化了登录、注销和保护路由的逻辑。而Flask-RESTful则助力构建RESTful API,支持多种HTTP方法和请求解析。通过这两个扩展,开发者能轻松增强Flask应用的功能性,实现安全的用户认证和高效的API交互。
|
6月前
|
JSON API 数据格式
构建高效Python Web应用:Flask框架与RESTful API设计实践
【2月更文挑战第17天】在现代Web开发中,轻量级框架与RESTful API设计成为了提升应用性能和可维护性的关键。本文将深入探讨如何使用Python的Flask框架来构建高效的Web服务,并通过具体实例分析RESTful API的设计原则及其实现过程。我们将从基本的应用架构出发,逐步介绍如何利用Flask的灵活性进行模块化开发,并结合请求处理、数据验证以及安全性考虑,打造出一个既符合标准又易于扩展的Web应用。
795 4