小白入门基础 - 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.mzph.cn/news/603148.shtml

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

相关文章

「HDLBits题解」Andgate

本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接&#xff1a;Andgate - HDLBits module top_module( input a, input b, output out );assign out a & b ; endmodule

八大算法排序@归并排序(C语言版本)

目录 归并排序概念算法思想第一步第二步第三步 算法步骤代码实现代码1代码优化 时间复杂度空间复杂度特性总结 归并排序 概念 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治策略的经典排序算法。它的基本思想是将待排序的数组划分成两个子数组&#xff0c;分别对…

17.Linux Shell输入输出流管理

文章目录 Linux Shell输入输出流管理1)标准文件描述符2)脚本中重定向输出临时重定向永久重定向自定义输出重定向 3)重定向输入4)支持读写的文件描述符5)关闭文件描述符6) 列出打开的文件描述符及关闭文件描述符7)输出同时发送到显示器和日志文件 欢迎访问个人网络日志&#x1f…

大模型实战笔记02——大模型demo

大模型实战笔记02——大模型demo 1、大模型及InternLM模型介绍 2、InternLM-Chat-7B智能对话Demo 3、Lagent智能体工具调用Demo 4、浦语灵笔图文创作理解Demo 5、通用环境配置 注 笔记图片均为视频截图 笔记课程视频地址&#xff1a;https://www.bilibili.com/video/BV1Ci4y1…

基于 IP 多播的网络会议程序(2024)

1.题目描述 局域网 IP 多播程序&#xff0c;设计一个图形界面的网络会议程序&#xff08;实现文本多播方式即可&#xff09;。 2.演示Demo 3.参考代码 广播发送代码 //服务端 #include <winsock2.h> #include <iostream> #include <list>#pragma comment(l…

顶顶通呼叫中心中间件通过队列外呼拨打另一个sip并且放音(mod_cti基于FreeSWITCH)

介绍 顶顶通呼叫中心中间件通过队列外呼拨打另一个sip并且放音 一、添加acl 打开ccadmin->点击配置文件->点击acl.conf->在</list>后面添加一条图中的信息->muqi是我自己设置的名字你们可以修改为自己需要的名字->添加好了点击提交XML->在运维调试点…

如何理解链接(Linking)这一编译过程中的步骤

在理解链接&#xff08;Linking&#xff09;这一编译过程中的步骤之前&#xff0c;有必要了解编译器的整体工作流程。编译器通常经历以下几个阶段&#xff1a; 预处理&#xff08;Preprocessing&#xff09;&#xff1a;处理源代码文件中的预处理指令&#xff0c;如 #include 指…

Redis概览

Redis存储是Key-Value结构的数据&#xff0c;其中Key是字符串类型&#xff0c;Value有5种常见的数据类型 字符串 String 哈希 hash 列表 list 集合 set 有序集合 sorted set / zset 各种数据类型的特性 字符串操作命令 : ● SET ke…

v8 pwn利用合集

文章目录 前置知识JS Object 相关Ignition 相关JIT - turboFan 相关starCTF2019 OOB【越界读写map字段】googleCTF2018 jit【浮点数精度丢失导致越界读写】数字经济线下 Browser【Object::toNumber中callback导致的越界写】前置知识 JS Object 相关 V8 中的对象表示 ==> 基…

LeetCode 2125. 银行中的激光束数量【数组,遍历】1280

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

深入理解 Vue.js 中的 `h` 函数:虚拟 DOM 创建指南

Vue.js 是一个用于构建用户界面和单页应用程序的渐进式 JavaScript 框架。它的核心概念之一是虚拟 DOM&#xff0c;这是实际 DOM 的轻量级副本&#xff0c;Vue 使用它来优化对网页的更新。为了操作虚拟 DOM&#xff0c;Vue 提供了一个通常被称为 h 函数的方法。这个函数对于理解…

大模型查询工具助手之股票免费查询接口

新浪股票免费查询接口 股票研究的实践中需要查询股票市场接口&#xff0c;百度搜索大多链接都要收费或者注册。 记得新浪股票以前是免费查询&#xff0c;但现在遇到了小问题。 决策引擎专栏&#xff1a; Falcon构建轻量级的REST API服务 决策引擎-利用Drools实现简单防火墙策…

vue 用 h() 函数创建 Vnodes

目录 前言一、h() 函数的基本使用方式二、h() 函数的进阶使用方式1、条件渲染2、列表渲染3、事件4、使用插槽 前言 Vue 提供了一个 h() 函数用于创建 vnodes。 h() 是 hyperscript 的简称——意思是“能生成 HTML (超文本标记语言) 的 JavaScript”。 const vnode h(div, /…

技术学习周刊第 1 期

2018 年参与过 1 年的 ARTS 打卡&#xff0c;也因为打卡有幸加入了 MegaEase 能与皓哥&#xff08;左耳朵耗子&#xff09;共事。时过境迁&#xff0c;皓哥已经不在了&#xff0c;自己的学习梳理习惯也荒废了一段时间。 2024 年没给自己定具体的目标&#xff0c;只要求自己好好…

电话号码信息收集工具:PhoneInfoga | 开源日报 No.137

sundowndev/phoneinfoga Stars: 11.2k License: GPL-3.0 PhoneInfoga 是一个用于扫描国际电话号码的信息收集框架&#xff0c;它允许用户首先收集基本信息 (如国家、地区、运营商和线路类型)&#xff0c;然后使用各种技术来尝试找到 VoIP 提供商或识别所有者。该工具与一系列必…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-7二阶系统

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-7二阶系统 1. 二阶系统对初始条件的动态响应 Matlab/Simulink - 2nd Order Syetem Response to IC2. 二阶系统的单位阶跃响应 2nd Order System Unit Step Response3. 二…

copilot在pycharm的应用

Copilot在PyCharm中的应用 一、引言 随着人工智能技术的飞速发展&#xff0c;AI在编程领域的应用也越来越广泛。Copilot&#xff0c;作为一款由微软开发的AI编程助手&#xff0c;已经引起了广大开发者的关注。它利用深度学习技术&#xff0c;通过分析大量开源代码&#xff0c…

Linux-v4l2框架

框架图 从上图不难看出&#xff0c;v4l2_device作为顶层管理者&#xff0c;一方面通过嵌入到一个video_device中&#xff0c;暴露video设备节点给用户空间进行控制&#xff1b;另一方面&#xff0c;video_device内部会创建一个media_entity作为在media controller中的抽象体&a…

unity中0GC优化方案《zstring》

文章目录 序言简介GC带来的问题性能瓶颈玩家体验受损 使用方式 序言 游戏开发秉承遇到好东西要分享&#xff0c;下面介绍zstring&#xff0c;感谢作者开源无私奉献 源码地址&#xff1a;https://github.com/871041532/zstring 简介 GC带来的问题 性能瓶颈 GC暂停主线程执行…

LaTeX中常用的字母及符号

收集 LaTeX 中常用的字母、符号。 字体字形设置 命令实例说明\fbox LaTeX \fbox{LaTeX} LaTeX​加边框\boxed L a T e X \boxed{LaTeX} LaTeX​斜体加边框\mathbf L a T e X \mathbf{LaTeX} LaTeX加粗\boldsymbol L a T e X \boldsymbol{LaTeX} LaTeX斜体加粗 希腊字母 符号…