小白入门基础 - Restful

一: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")@ResponseBodypublic 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")@ResponseBodypublic 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.rhkb.cn/news/233218.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大数据】Spark学习笔记

初识Spark Spark和Hadoop HadoopSpark起源时间20052009起源地MapReduceUniversity of California Berkeley数据处理引擎BatchBatch编程模型MapReduceResilient distributed Datesets内存管理Disk BasedJVM Managed延迟高中吞吐量中高优化机制手动手动APILow levelhigh level流…

MySQL之视图外连接、内连接和子查询的使用

目录 一、视图 1.1 含义 1.2 操作 1.3 SQL数据 二、连接查询案例 &#xff08;1&#xff09;查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 &#xff08;2&#xff09;查询同时存在" 01 "课程和" 02 "课程的情况 &a…

docker安裝gocd-server,并配置gitlab授权登录

gocd的地址&#xff1a;Installing GoCD server on Windows | GoCD User Documentation gocd文档&#xff1a;GitHub - gocd/docker-gocd-server: Docker server image for GoCD 一、docker拉取gocd镜像 #拉取server镜像 docker pull gocd/gocd-server:v21.1.0docker pull g…

java SSM水质历史数据可视化设计myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM水质历史数据可视化设计是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

QT常用控件使用及布局

QT常用控件使用及布局 文章目录 QT常用控件使用及布局1、创建带Ui的工程2、ui界面介绍1、界面设计区2、对象监视区3、对象监属性编辑区4、信号与槽5、布局器6、控件1、Layouts1、布局管理器2、布局的dome 2、Spacers3、Buttons4、项目视图组(Item Views)5、项目控件组(Item Wid…

“数据要素×”正式来袭|美创“全栈能力、深入场景”保障数据价值安全释放

千呼万唤&#xff0c;1月4日&#xff0c;国家数据局等17部门联合印发的《“数据要素”三年行动计划&#xff08;2024—2026年&#xff09;》&#xff08;下称《三年行动计划》&#xff09;正式发布&#xff01; 作为国家数据局成立以来公开发布的首个重磅文件&#xff0c;《三年…

大数据StarRocks(四) :常用命令

这次主要介绍生产工作中使用Starrocks时的常用命令 4.1 连接StarRocks 4.1.1 Linux命令行连接 [roothadoop1011 fe]# yum install mysql -y [roothadoop1011 fe]# mysql -h hadoop101 -uroot -P9030 -p4.1.2 Windows客户端 DBeaver 连接 4.2 常用命令 4.2.1 查看状态 1. 查…

uniapp获取手机当前信息及应用版本

appVersion 是app端查询的数据信息 appWgtVersion 是浏览器端查询的数据信息 onLoad() {const systemInfo uni.getSystemInfoSync();console.log(systemInfo);// #ifdef H5const uniAppVersion systemInfo.appVersion;// #endif// #ifndef H5const uniAppVersion systemIn…

案例分享:Qt多国语言输入法软键盘

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135346374 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

vue-springboot基于java的实验室安全考试系统

本系统为用户而设计制作实验室安全考试系统&#xff0c;旨在实现实验室安全考试智能化、现代化管理。本实验室安全考试管理自动化系统的开发和研制的最终目的是将实验室安全考试的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更多的…

模板管理支持批量操作,DataEase开源数据可视化分析平台v2.2.0发布

2024年1月8日&#xff0c;DataEase开源数据可视化分析平台正式发布v2.2.0版本。 这一版本的功能升级包括&#xff1a;在“模板管理”页面中&#xff0c;用户可以通过模板管理的批量操作功能&#xff0c;对已有模板进行快速重新分类、删除等维护操作&#xff1b;数据大屏中&…

大数据 - Doris系列《二》- Doris安装(亲测成功版)

目录 &#x1f436;2.1 安装前准备 &#x1f959;1.设置系统最大文件打开句柄数 >启动一个程序的时候&#xff0c;打开文件的数量就是句柄数 &#x1f959;2.设置文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量 &#x1f959;3.时钟同步 &#x1f959;4.关闭交…

labelImg的安装与使用

目录 1、查看本机是否安装labelImg 2、安装labelImg 3、创建自己的数据集 3.1 建立新文件夹 3.2 打开labelImg 注意&#xff1a;出现闪退的情况处理。 4、文件格式转换 4.1 修改文件夹路径 4.2 新建datasets文件夹 4.3 修改图片路径 4.4 执行 1、查看本机是否安装la…

uniCloud 云函数

相对于云函数&#xff0c;官方更推荐使用 云对象 新建云函数 编辑云函数 uniCloud-aliyun/cloudfunctions/hello_func/index.js use strict; exports.main async (event, context) > {let {name} eventreturn 你好&#xff0c;${name}! };云函数接收的参数从event中解构获…

部署可道云网盘的一个漏洞解决

目录 1漏洞展示 2.防范措施 1漏洞展示 因为可道云网盘的上传文档有保存在 /data/Group/public/home/文档/ 中,当别有用心之人知道个人部署的域名与上次的文件后&#xff0c;可以进行访问拿到uid。例我在我部署的网盘上上次一个aa.php 文件&#xff0c;然后拿来演示 然后通过…

密码学中的Hash函数

目录 一. 介绍 二. hash函数的五个基本性质 &#xff08;&#xff11;&#xff09;压缩性 &#xff08;&#xff12;&#xff09;正向计算简单性 &#xff08;&#xff13;&#xff09;逆向计算困难性 &#xff08;&#xff14;&#xff09;弱无碰撞性 &#xff08;&…

RabbitMQ(八)消息的序列化

目录 一、为什么需要消息序列化&#xff1f;二、常用的消息序列化方式1&#xff09;Java原生序列化&#xff08;默认&#xff09;2&#xff09;JSON格式3&#xff09;Protobuf 格式4&#xff09;Avro 格式5&#xff09;MessagePack 格式 三、总结 RabbitMQ 是一个强大的消息中间…

安全基础~信息搜集3

文章目录 知识补充APP信息搜集php开发学习理解漏洞 知识补充 端口渗透总结 python Crypto报错&#xff1a;https://blog.csdn.net/five3/article/details/86160683 APP信息搜集 1. AppInfoScanner 移动端(Android、iOS、WEB、H5、静态网站)信息收集扫描工具 使用教程 演示&…

【Harmony OS - 网络请求】

在一个应用开发中&#xff0c;网络请求是必不可少的&#xff0c;我们一般用的fetch、axios来进行http请求&#xff0c;在鸿蒙中也可以通过createHppt来发生一个http请求&#xff0c;它们都是异步请求返回的Promise&#xff0c;下面我们将介绍’ohos.net.http’和axios这两种方式…

网络端口(包括TCP端口和UDP端口)的作用、定义、分类,以及在视频监控和流媒体通信中的定义

目 录 一、什么地方会用到网络端口&#xff1f; 二、端口的定义和作用 &#xff08;一&#xff09;TCP协议和UDP协议 &#xff08;二&#xff09;端口的定义 &#xff08;三&#xff09;在TCP/IP体系中&#xff0c;端口(TCP和UDP)的作用 &#xff08;…