小白入门基础 - Restful

news2024/9/20 1:15:12

一:REST与RESTful:

REST:表现层状态转移,资源在网络中以某种形式进行状态转移。
RESTful是基于REST理念的一套开发风格,是具体的开发规则。

 服务器端只返回数据,以json或者xml的格式。

RESTful开发规范:

       • 使用URL作为用户交互入口
  • 明确的语义规范(GET|POST|PUT|DELETE)
  • 只返回数据(JSON|XML),不包含任何展现

RESTful命名要求:

二:第一个RESTful应用

@Controller
@RequestMapping("/restful")  //URL中所有的都是名词
public class RestfulController {
    @GetMapping(value = "/request",produces = "application/json;charset=utf-8")
    @ResponseBody
    public String doGetRequest(){
        return "{\"message\":\"测试\"}";  //使用\原义输出
    }
}

三:实现RESTful实验室

一般PC和移动端都可以调用API接口,下面模拟PC端调用,使用Ajax:

通过ajax发送页面请求:

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

因为定义了webapp为静态文件的根目录,所以client.html可以直接访问。

竟然产生了乱码,查看请求头,发现采用不正确的字符集。

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>test/html;charset=utf-8</value>
                    <!--通知浏览器以这种格式加载数据-->
                    <value>application/json;charset=utf-8</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

添加以上配置就可以了。(只能解决ajax乱码问题)

四:RestController注解与路径变量

(1)RestController

@Controller
@RequestMapping("/restful")  //URL中所有的都是名词
public class RestfulController {
    @GetMapping(value = "/request",produces = "application/json;charset=utf-8")
    @ResponseBody
    public String doGetRequest(){
        return "{\"message\":\"测试\"}";  //使用\原义输出
    }
}

如果我们希望返回纯文本数据,我们必须要使用@ResponseBody这个注解。
如果我们使用@RestController这个注解,那么类下面所有方法都是返回纯文本数据。

@RestController
@RequestMapping("/restful")  //URL中所有的都是名词
public class RestfulController {
    @GetMapping(value = "/request",produces = "application/json;charset=utf-8")
    public String doGetRequest(){
        return "{\"message\":\"测试\"}";  //使用\原义输出
    }
}

@RestController可以帮我们简化开发。

(2)路径变量

/request/1 对于放在URL中的变量我们可以称之为路径变量。那么如何取值了?

@RestController
@RequestMapping("/restful")  //URL中所有的都是名词
public class RestfulController {
    @GetMapping(value = "/request/{rid}",produces = "application/json;charset=utf-8")
    public String doGetRequest(@PathVariable("rid") Integer requestId){
        System.out.println(requestId);
        return "{\"message\":\"测试\"}";  //使用\原义输出
    }
}

使用@PathVariable路径变量注解进行接收,而后赋值给方法参数。

五:JSON序列化

(1)引入步骤

导入依赖包:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <!--一定要使用2.9.9之后的版本,否则会有安全问题-->
    <version>2.9.9</version>
</dependency>
<!--jackson与目标对象交互的根源-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.9</version>
</dependency>

 spring非常智能,只要检查有jackson-core和jackson-databind这两个依赖包。
就会自动启用jackson为我们提供json序列化服务。

创建实体类:

public class Person {
    private String name;
    private String address;
}

编写控制器:

@GetMapping("/person/{pid}")
public Person findByPersonId(@PathVariable("pid") Integer personId){
    Person person = new Person();
    if (personId == 1){
        person.setName("科比");
        person.setAddress("湖北罗田");
    } else if (personId == 2){
        person.setName("星爷");
        person.setAddress("湖北安陆");
    } else {
        person.setName("无名氏");
    }
    return person;
}

如果我们返回一个实体对象,并且配置了@RestController或者@ResponseBody,那么jackson就会自动提供序列化服务。

访问:

(2)返回多个对象

如果一次返回多个对象,我们可以List集合:

@GetMapping("/persons")
public List<Person> findPersons(){
    List list = new ArrayList();
    Person p1 = new Person();
    p1.setName("科比");
    p1.setAddress("湖北罗田");
    Person p2 = new Person();
    p2.setName("科比");
    p2.setAddress("湖北罗田");
    list.add(p1);
    list.add(p2);
    return list;
}

在前端,我们会收到如下数据:

在页面中,我们可以通过如下方式进行提取:

$(function () {
    $("#btnPersons").click(function () {
        $.ajax({
            url : "/restful/persons",
            type : "get",
            datatype : "json",
            success : function (json) {
                console.info(json)
                for(var i=0;i<json.length;i++){
                    var p = json[i];
                    $("#divPersons").append("<h2>" + p.name + "-" + p.address + "</h2>")
                }
            }
        })
    })
})

(3)时间处理

需要注意的是,jackson对时间处理并不友好:
添加事件属性:
private Date birthday;
如果不做处理,就是直接返回事件戳的形式。

 我们只需要添加对应时间注解:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
就可以正常输出了:

还有需要注意的是默认使用格林时间,需要指定时区:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date birthday;

六:浏览器的同源策略

同源策略:阻止从一个域加载的脚本去获取另一个域上的资源。
两个不同域名的网站不能通过Ajax访问,这是出于安全的因素考虑。
比如下面两个地址,虽然本质是一个页面,但是却属于不同源.

只要协议、域名、端口有任何不同,都被当做是不同的域。
浏览器Console看到Access-Control-Allow-Origin就代表跨域了。

HTML中允许跨域的标签:
  <img> 显式远程图片
  <script> 加载远程JS
  <link> 加载远程CSS

七:SpringMVC解决跨域

CORS是一种机制,使用额外的HTTP头通知浏览器访问其他域。
URL响应头中包含Access-Control-*指明请求允许跨域。

(1)@CrossOrigin - Controller跨域注解

@RestController
@RequestMapping("/restful") 
@CrossOrigin(origins = {"*"}) 
public class RestfulController {
    @GetMapping(value = "/request/{rid}",produces = "application/json;charset=utf-8")
    public String doGetRequest(@PathVariable("rid") Integer requestId){
        System.out.println(requestId);
        return "{\"message\":\"测试\"}"; 
    }
}

(2)<mvc:cors> Spring MVC全局跨域配置

<mvc:cors>
    <!--path哪一个路径允许跨域访问-->
    <!--allowed-origins允许谁进行跨域访问-->
    <!--max-age设置缓存时间-->
    <mvc:mapping path="*" allowed-origins="*"/>
</mvc:cors>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1366428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小白新手轻松部署扫雷小游戏

小白新手轻松部署扫雷小游戏 云效云效操作导入资源镜像仓库应用配置 最后 说到扫雷小游戏&#xff0c;可以说大家都玩儿过&#xff0c;印象中刚接触计算机的时候&#xff0c;对于这个扫雷小游戏&#xff0c;很多人都很喜欢&#xff0c;觉得很有意思&#xff0c;大家一起挑战看谁…

win10报错“COMDLG32.OCX文件丢失,软件无法启动”,快速修复方法,亲测有效

COMDLG32.OCX文件是Windows操作系统中的一个ActiveX控件文件&#xff0c;是Common Dialogs控件的一部分&#xff0c;主要用于支持各种软件运行时的一些基本功能&#xff0c;如打开、保存文件对话框等。 COMDLG32.OCX文件的作用主要体现在以下几点&#xff1a; 1. 提供应用程序通…

Commander One for Mac:强大的双窗格文件管理器,让你的工作效率倍增!

Commander One for Mac是一款功能强大的文件管理工具&#xff0c;具有以下主要功能&#xff1a; 双窗格设计&#xff1a;主界面分为两个窗格&#xff0c;用户可以在左侧窗格中导航和浏览文件系统的目录结构&#xff0c;在右侧窗格中查看文件和文件夹的内容。文件操作&#xff…

【教学类-45-02】X-Y之间的三连减题(a-b-c=)

作品展示&#xff1a; 背景需求&#xff1a; 【教学类-45-01】X-Y之间的三连加题(abc)-CSDN博客文章浏览阅读5次。【教学类-45-01】X-Y之间的三连加题(abc)https://blog.csdn.net/reasonsummer/article/details/135436915 有了三连加怎么能没有三连减&#xff0c;修改参数&am…

Vmware安装Windows11系统及下载MySQL步骤(超详细)

一、创建虚拟机 ①选择自定义 ②直接点击下一步 ③选择Windows 11 x64 ④命名虚拟机以及选择路径 ⑤新版本的虚拟机需要加密&#xff08;密码需要8个字符以上&#xff09; ⑥选择UEFI ⑦处理器配置&#xff08;根据自己的需求&#xff09; ⑧设置虚拟机的内存 ⑨选择不使用网络…

LeetCode 2807. 在链表中插入最大公约数【链表,迭代,递归】1279

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

天锐绿盾文档加密系统

绿盾文档加密系统是一种针对企业数据安全而设计的解决方案&#xff0c;旨在保护企业核心数据不被泄露。该系统由文件加密模块、内网安全模块等部分组成&#xff0c;主要功能包括对需要保护的文件进行强制加密保护&#xff0c;并对文件的使用进行全程监控。通过绿盾文档加密系统…

数据结构之B树和B+树

数据结构可视化演示链接&#xff0c;也就是视频中的网址 文章目录 一、B-Tree二、BTree(B-Tree变种) 一、B-Tree 叶节点具有相同的深度&#xff0c;叶节点的指针为空所有索引元素不重复节点中的数据索引从左到右递增排列 二、BTree(B-Tree变种) 非叶子节点不存储 data &#…

如何进行深入的竞品分析:掌握这些技巧让你更加了解市场

随着互联网行业的快速发展&#xff0c;产品经理需要对竞品进行深入分析&#xff0c;才能更好地把握市场需求和趋势&#xff0c;为公司带来更好的商业价值。那么&#xff0c;如何做好竞品分析呢&#xff1f;以下是我对于这个问题的思考和建议。 一、确定分析的目的和范围 在开…

积分的求法

1.第一类换元积分法&#xff08;凑微分法&#xff09;&#xff1a;用dt代替dx&#xff0c;积分消失加常数 2.第二类换元积分法&#xff08;用于开根号&#xff09;&#xff1a;用sint,cost,tant代替x&#xff0c;其中tant可以用于secx的平方-1tanx的平方 3.倒代换&#xff1a…

10个常用恶意软件检测分析平台(网工精选)

你们好&#xff0c;我的网工朋友。 我们往期的文章已经同步过很多的好用工具&#xff0c;毕竟&#xff0c;作为一个职场网工人&#xff0c;提升效率才是才能在单位时间内赚到更多的工资 往期的好用工具收到了不少好的反响&#xff0c;今天更新一波新的工具安利&#xff0c;专…

Python实现PowerPoint(PPT/PPTX)到PDF的批量转换

演示文稿是一种常见传达信息、展示观点和分享内容的形式&#xff0c;特别是PowerPoint演示文稿&#xff0c;广泛应用于各行各业&#xff0c;几乎是演讲等场合的必备工具。然而&#xff0c;演示文稿也有其限制&#xff0c;对设备的要求较高&#xff0c;且使用不同的软件或设备演…

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成 --合并生成后的代码【鱼皮】

一、模块页面功能 1.1 domain 【实体对象】 1.2 mapper 【操作数据库的对象】--> UserMapper 1&#xff09;UserMapper 其实就是我们用来操作数据库的一个对象 2) 继承了mybatis- plus&#xff0c;它会自动帮我们去定义一些增删改查的方法。 继承可以看下图&#xf…

1.4~1.5链表复习,代码操作(反转链表(用栈解决,双指针),删除链表指定元素),链表选择题,广义表

删除链表内指定范围的数 思路是双指针&#xff0c;定义两个指针&#xff0c;一个去找当前这个数满不满足要求&#xff0c;然后另一个定义为删除区间的起点 &#xff0c; 当不满足时&#xff0c;两个指针同时向后移动&#xff1b;当满足时&#xff0c;前驱指针就不动了&#xf…

决策树--CART分类树

1、介绍 &#xff08;1&#xff09;简介 CART&#xff08;Classification and Regression Trees&#xff09;分类树是一种基于决策树的机器学习算法&#xff0c;用于解 决分类问题。它通过构建树状的决策规则来对数据进行分类。 &#xff08;2&#xff09;生成过程 ① 选择…

AR眼镜定制_ar智能眼镜5G硬件解决方案

AR眼镜近年来备受瞩目&#xff0c;其易于佩戴、轻巧耐用、功能强大、用途广泛的特点受到了广泛关注。 AR眼镜的应用场景非常广泛&#xff0c;不仅包括消费级市场&#xff0c;还涵盖了旅游、教育、工业、医疗等多个领域。新的工业AR穿戴技术以及工业级语音交互操作系统&#xff…

2020年认证杯SPSSPRO杯数学建模D题(第二阶段)让电脑桌面飞起来全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 D题 让电脑桌面飞起来 原题再现&#xff1a; 对于一些必须每天使用电脑工作的白领来说&#xff0c;电脑桌面有着非常特殊的意义&#xff0c;通常一些频繁使用或者比较重要的图标会一直保留在桌面上&#xff0c;但是随着时间的推移&#xff0c;…

【css】快速实现鼠标悬浮变色效果

<div class"nav-item"><div class"ic-img"></div><div>切换</div> </div>.nav-item {width: 100rem;height: 45rem;line-height: 45rem;display: flex;text-align: center;justify-content: center;align-items: cent…

1.5PTA集练6-1~6-4,7-3,7-4(6/26)

6-1 顺序表的删除 分数 10 List Delete( List &L, ElementType minD, ElementType maxD ){int k0;for(int i0;i<L.last;i){if(L.Data[i]<maxD&&L.Data[i]>minD){L.Data[k]L.Data[i];}}L.lastk;return L; } 这个就是注意L需要是用.,而不是用->&#x…

lc 140. 单词拆分 II

回溯算法查询匹配单词 class Solution { public:unordered_map<string, int> word_map;void mapping(vector<string>& wordDict){for(auto &a : wordDict)word_map[a];}vector<string> ret;// s: 原始字符串// tmp: 已查询到的单词// …