什么是前后端分离?有哪些优点?
前后端分离是种架构模式,前端指的是生成HTML的那个服务,它可以是一个仅仅生成HTML的web服务,也可以是在浏览器中通过JS动态生成HTML的单页应用。实践中,有实力的团队往往在实现前后端分离时,前端选用node服务器,后端选用C#、Java等。一般来说,后端负责提供数据接口,不在渲染模板,以json格式返回数据。前端与后端进行交互,得到需要数据并加以展示。
优点:
责任分离,谁擅长开发啥,让谁负责啥
前后端解耦,接口复用(前端和客户端公用接口),减少开发量
各司其职,前后端同步开发,提升工作效率。定义好接口规范
更有利于调度(mock)、测试和运维部署
什么是REST,什么是RESTful
REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如web应用程序。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像一种设计风格。
REST指的是一组架构约束条件和原则满足这些约束条件和原则的应用程序或设计就是RESTful。
RESTful是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。
RESTful适用于移动互联网络厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增,变更,删除所调用资源。
RESTful有哪些特点
每一个URL代表1种资源
客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源
通过操作资源的表现形式来操作资源
资源的表现形式是XML或者HTML
客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。
开发过RESTful API吗?说下它的优点和缺点是啥?有没有更好的方案?
开发过,之前项目都是采用前后端分离方式开发的,后端接口的设计团队硬性要求必须符合RESTful风格,所以对RESTful API接口开发很熟悉。
优点:简单易用,它把任何对象当成一个资源,非常适合微服务提供的请求返回。
前后端分离,减少流量
安全问题集中在接口上,由于接受json格式,防止了注入型等安全问题
前端无关化,后端只负责数据处理,前端表现方式可以是任何前端语言(Android,iOS,HTML5)
前端和后端人员更加专注于各自开发,只需要接口文档便可完成前后端交互,无需过多相互了解
服务器性能优化:由于前端是静态页面,通过nginx便可获取,服务器主要压力放在了接口上
缺点:
多端(多次数据交互),在RESTful服务中一个URL表示一个资源。因此,当要获取多个资源时你必须请求多个不同的URL,进而带来多次数据交互
过度获取/获取后数据,前端需要某个对象部分字段,一个API请求后返回一个完整对象,造成资源浪费
API版本控制,当项目因为升级导致API版本变动,新变动的URL,让API的维护和使用变得困难,并且经常导致重复代码
替代方案:GraphQL API
你的RESTful是怎么学的
因为之前公司要写这样的项目接口
公司要做前后端分离的项目
公司要做微信小程序的开发
所以就开始学习RESTful规范,看的技术文章 阮一峰的博客学到的规范。
如何设计RESTful API?
请求路径-以当前操作的资源作为url地址,一般使用复数
请求方法-以web请求方法作为资源操作动作,约定:增:POST、删:DELETE、改:PUT、查:GET
请求参数-根据api接口实现逻辑决定,一般是业务决定
请求响应-根据需求决定,一般返回都是json格式
例子:
![](https://i-blog.csdnimg.cn/blog_migrate/fc1f446e3f2913f8b4a656fd05ee7fb4.png)
什么是安全的REST操作
REST API使用HTTP方法执行操作。一些不修改服务器资源的HTTP操作称为安全操作,包括GET和HEAD。另一方面,PUT,POST和DELETE是不安全的,因为它们修改了服务器上的资源
什么是幂等操作?为什么幂等性很重要?
有一些HTTP方法,比如GET。无论你使用多少次产生相同的相应,向同一个URL发送多个GET请求将导致相同的相应而没有任何副作用。因此,这被称为幂等。
另一方面,POST不是幂等的,因为如果你发送多个POST请求,它将导致在服务器上创建多个资源,但是,如果你使用它来更新资源,PUT也是幂等的。
甚至可以使用多个PUT请求来更新服务器上的资源,并给出相同的最终结果。
REST安全吗?你能做些什么来保护它?
安全是一个广义的术语:它可能意味着消息的安全性,这是由使用身份认证和授权提供的加密或访问限制提供的。REST通常不安全,但你可以使用Spring Security来保护它。
至少,你可以在Spring Security配置文件中使用HTTP启用HTTP基本身份认证。同样,如果底层服务器支持HTTPS,则可以使用HTTPS公开REST API
REST通常是无状态的吗?
是的,REST API应该是无状态的,因为它基于HTTP,也是无状态的。REST API中的请求应包含处理它所需的所有详细信息。它不应该依赖于先前或下一个请求或服务器端维护的某些数据,例如会话。REST规范提出了一个使其无状态的约束,你应该在设计REST API时牢记这一点。
HTTP请求响应的状态码都有哪些?
![](https://i-blog.csdnimg.cn/blog_migrate/1104438c9711a2a90a553d94cb9fef41.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d4d37b4c274ba5dd60b1f1aa410f9ed0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/07689a443c336ef0e19d93f58996c65e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/62f1d90fb66c2eebb8305d1a79b98814.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f1cba351ca53775a0121282847f5a3c6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f498c9679e3944f515bd3bfef78c5758.png)
![](https://i-blog.csdnimg.cn/blog_migrate/30137618b60e76b6f84366d8bc92d3a5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d286e67c86c8ad0421f6a0de8cdb8304.png)
![](https://i-blog.csdnimg.cn/blog_migrate/dc36113e4f1c069078f6191bc3b73191.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8eec7b6b898670e2171838d8abce5b5e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/844a35fecda4d620c816431288a27575.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ba7b08b61eae5d27ced98a74dd352199.png)
![](https://i-blog.csdnimg.cn/blog_migrate/399bf5aabb59addfe92b519caaf7a42b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a9fd47e2c8d6acd9ac937dea8cc57911.png)
常见的HTTP请求方法有哪些?
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
HEAD:向服务器索与GET请求相一致的相应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息
GET:向特定的资源发出请求。注意:GET方法不应当被作用于产生”副作用“的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和、或已有资源的修改。Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
PUT:向指定资源位置上传其最新内容
DELETE:请求服务器删除Request-URL所标识的资源
TRACE:回显服务器收到的请求,主要用于测试或诊断
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
常见的请求头有哪些?
HTTP最常⻅的请求头如下:
Accept:浏览器可接受的MIME类型;
Accept-Charset:浏览器可接受的字符集;
Accept-Encoding:浏览器能够进⾏解码的数据编码⽅式,⽐如gzip。Servlet能够向⽀持gzip的浏览器返回经gzip编码的HTML⻚⾯。许多情形下这可以减少5到10倍的下载时间;
Accept-Language:浏览器所希望的语⾔种类,当服务器能够提供⼀种以上的语⾔版本时要⽤到;
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;
Connection:表示是否需要持久连接。如果Servlet看到这⾥的值为“Keep-Alive”,或者看到请求使⽤的是HTTP 1.1(HTTP 1.1默认进⾏持久连接),它就可以利⽤持久连接的优点,当⻚⾯包含多个元素时(例如Applet,图⽚),显著地减少下载所需要的时间。要实现这⼀点,Servlet需要在应答中发送⼀个Content-Length头,最简单的实现⽅法是:先把内容写⼊ByteArrayOutputStream,然后在正式写出内容之前计算它的⼤⼩;
Content-Length:表示请求消息正⽂的⻓度;
Cookie:这是最重要的请求头信息之⼀;
From:请求发送者的email地址,由⼀些特殊的Web客户程序使⽤,浏览器不会⽤到它;
Host:初始URL中的主机和端⼝;
If-Modified-Since:只有当所请求的内容在指定的⽇期之后⼜经过修改才返回它,否则返回304“Not Modified”应答;
Pragma:指定“no-cache”值表示服务器必须返回⼀个刷新后的⽂档,即使它是代理服务器⽽且已经有了⻚⾯的本地拷⻉;
Referer:包含⼀个URL,⽤户从该URL代表的⻚⾯出发访问当前请求的⻚⾯。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值⾮常有⽤;
UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的⾮标准的请求头,表示屏幕⼤⼩、颜⾊深度、操作系统和CPU类型。
@RequestMapping注解有什么用?
用于将Web请求映射到SpringController方法。你可以根据HTTP方法映射请求,例如GET,POST和其他各种参数。
例如,如果使用Spring开发RESTful Web服务则可以使用,生成和使用属性以及媒体类型注释,以指示此方法仅用于生成或使用JSON
同样,你可以创建其他处理程序方法来生成JSON或XML
@Controller和@RequestController有什么区别?
两者之间存在许多差异,但最重要的是使用@RequestController自动获取@ResponseBody注释,这意味着你不需要使用@ResponseBody注释单独注释处理程序方法。这使得使用Spring更容易开发RESTful Web服务。
你在什么时候需要在Spring MVC中使用@ResponseBody注释?
@ResponseBody注释可以放在一个方法上,以指示返回类型应该直接写入HTTP响应主体(而不是放在模型中,或解释为视图名称)。或者,你也可以使用@ResController注释而不是@Controller注释。这将消除使用@ResponsBody的需要,因为正如前面的答案中所讨论的,它会自动带有@ResController注释。
@PathVariable在Spring MVC中做了什么?为什么它在REST中与Spring有用?
这是Spring MVC中有用的注释之一,它允许你从URL中读取值,例如查询参数。它在使用Spring创建RESTful Web服务时特别有用,因为在REST中,资源标识符是URL的一部分。