大家好,过去两周来,我一直在与Spring教程共享一些REST,今天,我将向申请Web开发人员角色的Java开发人员共享一些常见的Spring和REST面试问题。 由于Spring Framework是用于开发Java Web应用程序和RESTful Web Services的最受欢迎的标准框架,因此,任何高级Java开发人员都应该对Spring核心和Spring MVC有所了解,但是如果职位描述中提到了REST和Web Services,您还需要了解如何使用Spring Framework开发RESTful Web服务。 从Spring 3.1开始,该框架进行了很多增强,以支持RESTFul API即用型的许多功能,例如
通过仅检测类路径中的相关库(例如Jackson和JAXB), HTTPMessageConverter
可以将HTTP响应转换为JSON或XML 。
Spring还为RESTful Web服务提供了自定义的注释,例如@ RestController
,它可以使Controller知道REST,因此您无需执行每个REST API所需的常规工作,例如将响应转换为JSON。
在现实世界中,开发和保护RESTful Web服务也必须具备Spring Security的丰富知识。 由于没有安全性就无法使生活成为一个平凡的REST API,因此对安全性基础知识(例如HTTP基本身份验证 ,摘要身份验证,OAuth和JWT)的充分了解非常重要。
20 Spring REST Web服务面试问题
这是有关在Spring Framework中使用REST Web服务的几个常见问题。
REST代表什么? (回答)
REST代表REpresentational State Transfer,它使用HTTP协议将数据从客户端发送到服务器,例如,可以使用JSON或XML将服务器中的书交付给客户端。
什么是资源? (回答)
资源是REST体系结构中数据的表示方式。 通过将实体公开为资源,它允许客户端使用HTTP方法(例如GET , POST ,
放入 ,删除等
什么是安全的REST操作? (回答)
REST API使用HTTP方法执行操作。 某些不会在服务器上修改资源的HTTP操作被称为安全操作,例如GET和HEAD。 另一方面, PUT ,POST和DELETE是不安全的,因为它们会修改服务器上的资源。
什么是幂等运算? 幂等为什么重要? ( 回答 )
无论您使用多少次,都有一些HTTP方法(例如GET)会产生相同的响应,例如,将多个GET请求发送到同一URI将导致相同的响应而没有任何副作用,因此被称为等幂。
另一方面,POST不是幂等的,因为如果您发送多个POST请求,它将导致服务器上创建多个资源,但是如果您使用它来更新资源,则PUT同样是幂等的。
甚至,多个PUT请求更新服务器上的资源也会得到相同的最终结果。
REST是否可扩展和/或可互操作? (回答)
是的,REST是可伸缩且可互操作的。 它没有要求在客户端或服务器端选择特定的技术。 您可以使用Java,C ++,Python或JavaScript创建RESTful Web服务并在客户端使用它们。 我建议您读一本有关REST API的好书,例如RESTful Web服务,以了解有关REST的更多信息。
RestTemplate的优点是什么? ( 回答 )
RestTemplate
类是Spring框架中Template方法模式的实现。 与其他流行的模板类(例如JdbcTemplate
或JmsTempalte
,它还简化了与客户端RESTful Web服务的交互。 您可以使用它很容易地使用RESTful Web Servicer,如本示例所示。
REST使用哪种HTTP方法? ( 回答 )
REST可以使用任何HTTP方法,但是最受欢迎的方法是GET用于检索资源,POST用于创建资源,PUt用于更新资源以及DELETE用于从服务器中删除资源。
Spring REST中的HttpMessageConverter
是什么? (回答)
HttpMessageConverter
是一个Strategy接口 ,它指定可以在HTTP请求和响应之间进行转换的转换器。 Spring REST使用此接口将HTTP响应转换为各种格式,例如JSON或XML。
每个HttpMessageConverter
实现都有一个或多个与之关联的MIME类型。 Spring使用“ Accept”标头来确定客户端期望的内容类型。
然后它将尝试查找已注册的HTTPMessageConverter
,它能够处理该特定的内容类型,并使用它在将响应发送到客户端之前将其转换为该格式。
如何创建HttpMessageConverter
的自定义实现以支持新型的请求/响应? (回答)
您只需要创建AbstractHttpMessageConverter
的实现,并使用WebMvcConfigurerAdapter#extendMessageConverters()
方法将其注册,并生成新的请求/响应类型。
REST通常是无状态的吗? ( 回答 )
是的,REST API应该是无状态的,因为它基于同样也是无状态的HTTP。 REST API中的请求应包含其处理所需的所有详细信息,即它不应依赖于上一个或下一个请求或服务器端维护的某些数据,例如会话。 REST规范对使其成为无状态设置了约束,因此在设计REST API时应牢记这一点。
@RequestMapping
注释有什么作用? ( 回答 )
@RequestMapping
注释用于将Web请求映射到Spring Controller方法。 您可以基于HTTP方法(例如GET和POST)以及其他各种参数来映射请求。 例如,如果您正在使用Spring开发RESTful Web Service,则可以使用Produces和consumers属性以及媒体类型注释来指示此方法仅用于产生或使用JSON,如下所示:
@RequestMapping (method = RequestMethod.POST, consumes="application/json")
public Book save(@RequestBody Book aBook) {return bookRepository.save(aBook);
}
您可以类似地创建其他处理程序方法以生成JSON或XML。
@Controller是构造型吗? @RestController是构造型吗? ( 回答 )
是的, @Controller
@RestController
和@RestController
都是@RestController
型。 @Controller
实际上是Spring的@Component
型注释的一种特殊形式。 这意味着在容器的组件扫描过程中,Spring容器也会自动检测带有@Controller
注释的类。
并且, @RestController
是用于RESTful Web服务的@Controller
的特殊化。 它不仅结合了@ResponseBody
和@Controller
注释,而且还为您的控制器类赋予了更多含义,以清楚地表明它处理RESTful请求。
Spring框架也可以使用此注释来提供一些将来与REST API开发相关的更有用的功能。
@Controller
和@RestController
什么@RestController
? ( 回答 )
正如我在较早的文章中所讨论的, @Controller
@RestControlle
和@RestControlle
r之间有很多区别(请参见答案),但是最重要的是,使用@RestController
可以自动获得@ResponseBody
批注,这意味着您无需单独进行批注。您的带有@ResponseBody
批注的处理程序方法。 这使得使用Spring可以更轻松地开发RESTful Web服务。 你可以看到这里学习
在Spring MVC中何时需要@ResponseBody注释? ( 回答 )
可以在方法上放置@ResponseBody
批注,以指示应将返回类型直接写到HTTP响应主体(而不是放置在Model中或解释为视图名称)。
例如:
@RequestMapping(path = "/hello", method = RequestMethod.PUT)
@ResponseBody
public String helloWorld() {return "Hello World";
}
另外,您也可以使用@RestController
注释代替@Controller
注释。 这将消除使用@ResponseBody
的需要,因为如上一个答案中所述,它自动带有@RestController
批注。
Spring MVC中的@PathVariable
有什么作用? 为什么在带有Spring的REST中有用? ( 回答 )
这是Spring MVC的有用注释之一,它使您可以从URI(如查询参数)读取值。 在使用Spring创建RESTful Web服务的情况下,这特别有用,因为在REST中,资源标识符是URI的一部分。通常会向有经验的Spring MVC开发人员(例如4至6年的经验)提出这个问题。
例如,如果要提取101 ID,则在URL http://myapp.com/books/101
,可以使用Spring MVC的@PathVariable
注释。
成功的DELETE语句的HTTP状态返回码是什么? ( 回答 )
成功删除后,REST API应该返回什么状态代码没有严格的规则,即它可以返回200 Ok或204 No Content。 通常,如果DELETE操作成功并且响应主体为空,则返回204。如果DELETE请求成功并且响应主体为非空,则返回200
CRUD是什么意思? (回答)
CRUD是“创建,读取,更新和删除”的缩写。 在REST API中,POST用于创建资源,GET用于读取资源,
PUT用于更新资源,而DELETE用于从服务器删除资源。这是另一级初学者水平的Spring MVC问题,适用于1-3年的经验丰富的程序员
您在哪里需要@EnableWebMVC? (回答)
当使用Java配置而不是XML配置Spring MVC时,需要@EnableWebMvc
注释才能启用Spring MVC。 它等效<mvc: annotation-driven>in
XML配置中的<mvc: annotation-driven>in
。
它支持使用@RequestMapping
将传入请求映射到处理程序方法的@RequestMapping
@Controller-annotated
类。
在Spring MVC中何时需要@ResponseStatus
批注? ( 回答 )
一个3到5年经验丰富的Spring开发人员的好问题。 在Spring MVC和REST中的错误处理期间,需要@ResponseStatus
批注。 通常,当在服务器端引发错误或异常时,Web服务器将返回一揽子HTTP状态代码500 –内部服务器错误。
这可能适用于人类用户,但不适用于REST客户端。 如果找不到资源,则需要向他们发送正确的状态代码,例如404。 在这里可以使用@ResponseStatus
批注,该批注允许您发送自定义HTTP状态代码以及异常情况下的正确错误消息。
为了使用它,您可以创建自定义异常并使用@ResponseStatus
批注以及正确的HTTP状态代码和原因对其进行批注。
当从控制器的处理程序方法中抛出此类异常而未在其他任何地方处理此类异常时,带有已设置的正确HTTP状态代码的适当HTTP响应将发送到客户端。
例如,如果您正在为提供书籍信息的库编写RESTful Web服务,则可以使用@ResponseStatus
创建异常,当找不到书籍而不是内部服务器错误(500)时,该异常返回HTTP响应代码404,如图所示下面:
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Book") // 404public class BookNotFoundException extends RuntimeException {// ...}
如果从任何处理程序方法引发此异常,则将以“ No such Book”为原因的HTTP错误代码404返回给客户端。
REST安全吗? 您可以采取什么措施来保护它? ( 回答 )
这个问题通常是由经验丰富的Java程序员提出的,例如2至5年的REST和Spring经验。 安全性是一个广义的术语,它可能意味着通过加密或使用身份验证和授权提供的访问限制来提供消息的安全性。 REST通常并不安全,但是您可以使用Spring安全性来保护它。
至少您可以通过在Spring安全配置文件中使用HTTP来启用HTTP基本认证。 同样,如果基础服务器支持HTTPS,则可以使用HTTPS公开REST API。
REST是否可以与传输层安全性(TLS)一起使用? ( 回答 )
TLS或传输层安全性用于客户端和服务器之间的安全通信。 它是SSL(安全套接字层)的后继者。 由于HTTPS可以同时使用SSL和TLS,因此REST也可以使用TLS。
实际上,REST谈到了有关安全性的所有内容,这取决于实现该要求的服务器。 如果服务器支持SSL,则可以使用HTTP和HTTPS访问相同的RESTful Web服务。
如果您使用的是Tomcat,则可以在此处查看更多有关如何在Tomcat中启用SSL的信息。
您是否需要在类路径中使用Spring MVC来开发RESTful Web服务? ( 回答 )
经常向在Spring拥有1到2年经验的Java程序员提出这个问题。 简短的答案是,您需要Java应用程序的类路径中的Spring MVC才能使用Spring框架开发RESTful Web服务。 它实际上是Spring MVC中提供所有有用的注解如@RestController
, @ResponseCode
, @ResponseBody
, @RequestBody
和@PathVariable
,因此必须用弹簧mvc.jar或在你的pom.xml适当的Maven项
这就是针对初学者和经验丰富的Java JEE开发人员的一些常见的Spring REST Interview问题 。 如果您要获得Spring认证,这些问题对于提高您对Spring REST的知识也非常有用。 如果您从Spring认证的角度需要更多问题,可以在David Mayer的Core Spring Simulator上找到有关此主题的很多问题,它是目前通过Spring认证的最佳模拟器之一。
您可能喜欢的其他Spring教程和资源
- 5个免费课程,用于学习Core Spring和Spring Boot
- Spring MVC框架如何工作?
- Spring Security中的基本身份验证如何工作?
- Spring中DispatcherServlet的作用是什么?
- Spring中@ Service,@ Controller和@Component之间有什么区别
- Baeldung的REST with Spring认证课程
感谢您阅读本文,如果您喜欢本文,请与您的朋友和同事分享。 如果您有任何未在此列表中回答的问题,请发表评论,我会尽力为您找到答案。
翻译自: https://www.javacodegeeks.com/2018/02/top-20-spring-rest-interview-questions-answers-java-programmers.html