【实战指南】RESTful 从入门到精通(Spring Boot)

news/2024/9/19 0:41:23/ 标签: restful, spring boot, 后端, restful API, java, Spring, 面试

文章目录

  • RESTful 从入门到进阶
    • 引言
    • 第一部分:基础知识
      • 1. REST 概念介绍
      • 2. HTTP 方法和状态码
      • 3. RESTful 资源与URI
    • 第二部分:Java 实现 RESTful API
      • 4. Spring Boot 快速搭建 RESTful 服务
      • 5. 创建 RESTful 控制器
      • 6. 使用 JPA 进行数据持久化
    • 第三部分:高级主题
      • 7. 认证与授权
      • 8. 异常处理
      • 9. 测试 RESTful API

RESTful 从入门到进阶

引言

RESTful API 已经成为现代 Web 服务的标准之一,无论是在移动应用、Web 应用还是物联网领域都有着广泛的应用。掌握 RESTful API 的设计和实现对于任何前端或后端开发者来说都是必不可少的技能之一。

  • RESTful API 的重要性与应用场景
    • RESTful API 作为现代 Web 服务的核心,为客户端与服务器之间的交互提供了一种简洁、灵活的方式。
    • RESTful API 广泛应用于各种场景,包括移动应用、Web 应用、物联网设备等,它允许不同系统之间进行无缝的数据交换。
  • RESTful 设计原则简介
    • RESTful API 遵循 REST (Representational State Transfer) 架构风格,这是一种轻量级、无状态的服务交互方式。
    • RESTful 设计强调使用标准的 HTTP 方法(如 GET, POST, PUT, DELETE)来表示对资源的操作,并利用 URL 来唯一标识资源。
  • 为什么选择 Java 和 Spring Boot?
    • Java 是一种广泛使用的编程语言,特别是在企业级应用中。
    • Spring Boot 是基于 Spring 框架的一个简化版本,它提供了快速开发 RESTful 服务的能力,同时也简化了配置和依赖管理。
    • Spring Boot 内置了对 RESTful API 的支持,使得开发者能够快速构建可维护的 Web 服务。

第一部分:基础知识

1. REST 概念介绍

1. REST 定义

  • REST 是一种用于构建 Web 服务的设计风格,它的核心理念是将网络应用视为一组资源,这些资源通过统一的接口被访问和操作。
  • RESTful API 遵循 REST 架构风格,它是一种无状态的、客户端-服务器的、基于超文本传输协议 (HTTP) 的架构风格。
    2. RESTful 架构的关键特点
  • 无状态:每次请求都包含所有必要的信息,服务器不会存储客户端的状态。
  • 客户端-服务器模型:客户端和服务端分离,客户端负责显示和用户交互,服务端负责数据管理和业务逻辑。
  • 缓存:响应可以被缓存以提高性能。
  • 分层系统:中间层可以缓存数据,提高安全性。
  • 统一接口:通过标准的 HTTP 方法和状态码进行交互。
    3. RESTful 与 SOAP 的对比
  • RESTful API 通常使用简单的 HTTP 方法进行操作,而 SOAP 则是一种更为复杂的协议,使用 XML 格式进行消息传输。
  • RESTful API 更易于理解,更轻量级,更适合互联网应用;SOAP 更适合企业级应用,特别是那些需要事务保证的应用场景。

2. HTTP 方法和状态码

1. GET, POST, PUT, DELETE 等方法的用途

  • GET: 用于检索资源的信息。
  • POST: 用于创建新的资源。
  • PUT: 用于更新现有资源。
  • DELETE: 用于删除资源。
    2. 常见 HTTP 状态码解释
  • 200 OK: 请求成功。
  • 201 Created: 资源创建成功。
  • 204 No Content: 成功但没有返回数据。
  • 400 Bad Request: 客户端发送的请求有误。
  • 401 Unauthorized: 请求未经授权。
  • 403 Forbidden: 请求被拒绝。
  • 404 Not Found: 请求的资源不存在。
  • 500 Internal Server Error: 服务器内部错误。

3. RESTful 资源与URI

1. 资源定义

  • 在 RESTful API 中,资源是指可以通过 URI (Uniform Resource Identifier) 访问的对象或数据集合。
  • 资源可以通过 HTTP 方法来操作。
    2. URI 的设计原则
  • URI 应该简洁明了。
  • 使用名词而不是动词来命名资源。
  • 使用复数形式来表示资源集合。
  • 使用路径参数来表示特定资源的实例。
    3. 示例:设计一个用户资源的 URI
  • 用户资源集合的 URI 可以设计为 /users
  • 特定用户的 URI 可以设计为 /users/{userId},其中 {userId} 是路径变量,代表用户的唯一标识符。

第二部分:Java 实现 RESTful API

在这个部分,我们将详细介绍如何使用 Java 和 Spring Boot 快速搭建 RESTful 服务,并通过具体的代码示例来展示如何创建 RESTful 控制器以及如何使用 JPA 进行数据持久化。

Spring_Boot__RESTful__68">4. Spring Boot 快速搭建 RESTful 服务

Spring Boot 简介

Spring Boot 是 Spring 框架的一个衍生项目,旨在简化 Spring 应用的初始设置和配置。它提供了自动配置机制,使得开发者能够专注于编写业务逻辑代码,而不是繁琐的配置。

创建 Spring Boot 项目

为了创建一个新的 Spring Boot 项目,我们可以使用 Spring Initializr 来快速生成项目骨架。打开 Spring Initializr 网站 (https://start.spring.io/),选择以下选项:

  • Project: Maven Project
  • Language: Java
  • Packaging: Jar
  • Java: 11
  • Dependencies: Web, Thymeleaf (可选), Spring Data JPA, MySQL Driver (或您选择的数据库驱动)

点击“Generate”按钮下载项目模板。

添加 RESTful 支持

Spring Boot 默认已经包含了 RESTful 支持,我们不需要额外添加依赖。但是,为了方便测试 RESTful API,可以添加如下依赖:

<!-- pom.xml 文件 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

启动类和配置文件示例

src/main/java 目录下创建 com.example.restapi 包,并在该包下创建 RestApiApplication.java 文件作为启动类:

java">package com.example.restapi;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class RestApiApplication {public static void main(String[] args) {SpringApplication.run(RestApiApplication.class, args);}
}

接着,在 src/main/resources 目录下的 application.properties 文件中添加数据库连接配置:

spring.datasource.url=jdbc:mysql://localhost:3306/rest_api?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=password
spring.jpa.hibernate.ddl-auto=update

请确保替换数据库连接字符串、用户名和密码为您的实际配置。


5. 创建 RESTful 控制器

使用 @RestController 注解

@RestController 注解是一个组合注解,它结合了 @Controller@ResponseBody 注解的功能,用于标记一个类为 RESTful 控制器。

处理 HTTP 请求

下面是一个简单的例子,展示如何创建一个用户资源控制器:

java">package com.example.restapi.controller;import com.example.restapi.model.User;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import java.util.ArrayList;
import java.util.List;
import java.util.Optional;@RestController
@RequestMapping("/api/users")
public class UserController {private List<User> users = new ArrayList<>();@PostMappingpublic ResponseEntity<User> createUser(@RequestBody User user) {users.add(user);return ResponseEntity.status(201).body(user);}@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Long id) {Optional<User> user = users.stream().filter(u -> u.getId().equals(id)).findFirst();return user.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());}
}

返回 JSON 数据

在上面的例子中,我们使用了 ResponseEntity 类来控制响应的状态码和内容类型。默认情况下,Spring Boot 会将 Java 对象转换为 JSON 格式返回给客户端。


6. 使用 JPA 进行数据持久化

JPA 简介

Java Persistence API (JPA) 是 Java EE 规范的一部分,它提供了一个面向对象的方法来处理关系型数据库。Spring Data JPA 是 JPA 的一个简化版,它简化了数据访问层的编码。

创建实体类

首先,我们需要定义一个实体类来映射数据库表。例如,定义一个 User 类:

java">package com.example.restapi.model;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String email;// Getters and setters
}

创建 Repository 接口

接着,我们创建一个 UserRepository 接口来处理数据访问:

java">package com.example.restapi.repository;import com.example.restapi.model.User;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {User findByEmail(String email);
}

示例:实现 CRUD 操作

现在我们可以使用 UserRepository 来实现 CRUD (Create, Read, Update, Delete) 操作。修改 UserController 类来使用 UserRepository

java">package com.example.restapi.controller;import com.example.restapi.model.User;
import com.example.restapi.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import java.util.List;
import java.util.Optional;@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserRepository userRepository;@PostMappingpublic ResponseEntity<User> createUser(@RequestBody User user) {User createdUser = userRepository.save(user);return ResponseEntity.status(201).body(createdUser);}@GetMappingpublic ResponseEntity<List<User>> getAllUsers() {List<User> users = userRepository.findAll();return ResponseEntity.ok(users);}@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Long id) {Optional<User> user = userRepository.findById(id);return user.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());}@PutMapping("/{id}")public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User updatedUser) {return userRepository.findById(id).map(user -> {user.setName(updatedUser.getName());user.setEmail(updatedUser.getEmail());User savedUser = userRepository.save(user);return ResponseEntity.ok(savedUser);}).orElseGet(() -> ResponseEntity.notFound().build());}@DeleteMapping("/{id}")public ResponseEntity<?> deleteUser(@PathVariable Long id) {return userRepository.findById(id).map(user -> {userRepository.delete(user);return ResponseEntity.ok().build();}).orElseGet(() -> ResponseEntity.notFound().build());}
}

第三部分:高级主题

在这个部分,我们将深入探讨 RESTful API 的一些高级主题,包括认证与授权、异常处理以及如何测试 RESTful API。

7. 认证与授权

基本认证

基本认证是一种简单的身份验证机制,客户端通过 HTTP 头部发送用户名和密码。虽然简单易用,但它并不安全,不建议在生产环境中使用。

OAuth 2.0 简介

OAuth 2.0 是一种开放标准,用于授权应用程序访问受保护资源。它定义了客户端如何获取访问令牌,以及如何使用这些令牌来访问资源。

JWT (JSON Web Tokens)

JWT 是一种用于在各方之间安全地传输信息的标准格式。JWT 由三部分组成:头部、载荷和签名。JWT 通常用于认证过程,因为它可以包含用户的身份信息,并且可以在客户端和服务器之间传递。

示例:使用 Spring Security 配置 JWT

为了实现 JWT 认证,我们需要配置 Spring Security 并创建 JWT 相关的组件。

首先,在 pom.xml 中添加 Spring Security 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

接着,创建一个配置类来配置 Spring Security:

java">package com.example.restapi.config;import com.example.restapi.security.JwtAuthenticationEntryPoint;
import com.example.restapi.security.JwtAuthenticationFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate UserDetailsService userDetailsService;@Autowiredprivate JwtAuthenticationEntryPoint unauthorizedHandler;@Beanpublic JwtAuthenticationFilter authenticationJwtTokenFilter() {return new JwtAuthenticationFilter();}@Overridepublic void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Bean@Overridepublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Overrideprotected void configure(HttpSecurity httpSecurity) throws Exception {httpSecurity.cors().and().csrf().disable().exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests().antMatchers("/api/auth/**").permitAll().antMatchers("/api/test/**").permitAll().anyRequest().authenticated();httpSecurity.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);}
}

还需要创建 JwtAuthenticationFilterJwtAuthenticationEntryPoint 类来处理 JWT 的认证过滤和未授权的请求。


8. 异常处理

自定义异常类

在 RESTful API 中,我们经常需要自定义异常类来处理特定的错误情况。例如,定义一个 BadRequestException

java">package com.example.restapi.exception;public class BadRequestException extends RuntimeException {public BadRequestException(String message) {super(message);}
}

全局异常处理器

为了统一处理异常,我们可以创建一个全局异常处理器来捕获并处理异常:

java">package com.example.restapi.exception;import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;import java.util.Date;@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {@ExceptionHandler(value = {BadRequestException.class})public ResponseEntity<Object> handleBadRequest(BadRequestException ex, WebRequest request) {ErrorResponse error = new ErrorResponse(new Date(),ex.getMessage(),request.getDescription(false));return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);}@Overrideprotected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,org.springframework.http.HttpHeaders headers,HttpStatus status,WebRequest request) {ErrorResponse error = new ErrorResponse(new Date(),"Validation Failed",ex.getBindingResult().getAllErrors().get(0).getDefaultMessage());return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);}
}

示例:处理无效请求

下面是一个处理无效请求的示例:

java">package com.example.restapi.controller;import com.example.restapi.exception.BadRequestException;
import com.example.restapi.model.User;
import com.example.restapi.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid;@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;@PostMappingpublic ResponseEntity<User> createUser(@Valid @RequestBody User user, BindingResult result) {if (result.hasErrors()) {throw new BadRequestException("Invalid user data");}return ResponseEntity.status(201).body(userService.createUser(user));}
}

9. 测试 RESTful API

单元测试

单元测试是为了确保每个函数或方法按预期工作。例如,测试 UserService 中的方法:

java">package com.example.restapi.service;import com.example.restapi.model.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import static org.junit.jupiter.api.Assertions.assertNotNull;@SpringBootTest
public class UserServiceTests {@Autowiredprivate UserService userService;@Testpublic void testCreateUser() {User user = new User("John Doe", "johndoe@example.com");User createdUser = userService.createUser(user);assertNotNull(createdUser);}
}

集成测试

集成测试是为了确保多个组件一起工作时的行为符合预期。例如,使用 MockMvc 来模拟 HTTP 请求:

java">package com.example.restapi.controller;import com.example.restapi.model.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@WebMvcTest(UserController.class)
public class UserControllerTests {@Autowiredprivate MockMvc mockMvc;@Testpublic void shouldCreateUser() throws Exception {User user = new User("John Doe", "johndoe@example.com");mockMvc.perform(post("/api/users").contentType("application/json").content(objectMapper.writeValueAsString(user))).andExpect(status().isCreated());}
}

使用 MockMvc 进行模拟请求

在上面的测试示例中,我们使用了 MockMvc 来发送 POST 请求,并验证了返回的状态码是否为 201 Created



http://www.ppmy.cn/news/1519221.html

相关文章

【Redis】Redis 持久化 -- RDB AOF

文章目录 1 持久化介绍2 RDB2.1 RDB 介绍2.2 触发方式2.3 流程介绍2.4 RDB 文件2.5 RDB 优缺点 3 AOF3.1 AOF 介绍3.2 缓冲区刷新策略3.3 AOF 重写机制3.3.1 重写机制介绍3.3.2 混合持久化3.3.3 重写触发方式3.3.4 AOF 重写流程 3.4 AOF 优缺点 4 启动时数据恢复 1 持久化介绍 …

网络传输加密及openssl使用样例(客户端服务器)

文章目录 背景常用加密方式SSLOpenSSL主要功能 库结构 交互流程证书生成生成 RSA 私钥私钥的主要组成部分私钥的格式 创建自签名证书: 签发证书服务器端代码客户端代码常见错误版本问题证书问题证书格式 背景 网络传输中为保证数据安全&#xff0c;通常需要加密 常用加密方式…

php mail函数配置SMTP服务器发邮件的指南!

php mail函数安全性考虑&#xff1f;PHP mail()函数漏洞利用技巧&#xff1f; 在使用PHP进行开发时&#xff0c;发送邮件是一个常见的需求。使用php mail函数配置SMTP服务器发邮件&#xff0c;则是实现这一需求的有效途径。AokSend将详细探讨如何通过php mail函数来配置SMTP服…

【Linux】初识加搭建Linux

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

Nepctf2024-Web-NepDouble

一、题目 题目:NepDouble 题目描述&#xff1a;二、WriteUp 1. 源码分析# / app.route(/, methods[GET, POST]) def main():if request.method ! "POST":return Please use POST method to upload files.try:clear_uploads_folder()files request.files.get(tp_fi…

读懂华为V模型:连接业务与IT,用V模型指导服务化设计

今天笔者带来华为的V模型&#xff0c;与读者一起解读下&#xff0c;V模型是如何连接业务与IT&#xff0c;实现IT产品服务化设计的。 华为用V模型连接业务与IT&#xff0c;指导服务化设计&#xff0c;是一种创新的方法论&#xff0c;旨在通过业务与IT的深度融合&#xff0c;提升…

小程序自定义目录结构

精简目录 /my-miniprogram ├── /miniprogram │ ├── /pages │ │ └── /index │ │ ├── index.js │ │ ├── index.json │ │ ├── index.wxml │ │ └── index.wxss │ ├── app.js │ ├── app.json │…

培训第三十六天(docker应用,mysql容器应用,容器核对时间,容器之间的依赖 域名,文件联合系统,制作基础镜像,commit制作镜像)

上午 容器就是在镜像上添加了一个可写层 # 从镜像库中下载mysql镜像&#xff0c;mysql镜像是在基础镜像上加很多层制成的[rootdocker ~]# docker pull mysqlUsing default tag: latestlatest: Pulling from library/mysql6e839ac3722d: Pull complete ad912193ad5f: Pull comp…

网工面试题(安全)

上一篇&#xff1a;网工面试题&#xff08;数通&#xff09; 防火墙 防火墙的应用场景 防火墙&#xff1a;部署在网络出口处/服务器区(数据中心&#xff09;/广域网接入&#xff0c;用于防止外界黑客攻击、保护内网安全硬件。 传统防火墙和下一代防火墙的区别 传统防火墙的功能…

关于vue3.x中最长递增子序列(LIS)

什么是最长递增子序列&#xff1f; 简单来说最长递增子序列就是在一个数组中呈现递增的数据的长度 lettcode原题 示例&#xff1a;我们有一个数组 arr const arr [10, 9, 2, 5, 3, 7, 101, 18]那么他的序列有那些呢&#xff1f; [2][2, 3][2, 5][2, 3, 7][2, 5, 7][2, 3, 1…

常用的加密算法分析

常用的加密算法主要分为对称加密算法&#xff08;DES、3DES、AES&#xff09;、非对称加密算法&#xff08;RSA、DSA、ECC&#xff09;以及散列算法&#xff08;MD5、SHA&#xff09;三大类。 一、对称加密算法 对称加密算法&#xff0c;又称为单密钥加密或共享密钥加密&…

Expected expression after operator

这个错误直译过来就是:运算符号后没有预期的表达式 这个错误通常出现在编程语言中&#xff0c;尤其是在编写C或C等类型语言的时候&#xff0c;它意味着在源代码中遇到了一个操作符&#xff08;比如 , -, *, /, , 等等&#xff09;&#xff0c;但在该操作符后面没有紧跟相应的表…

Spring MVC RESTful API - 修改状态接口示例

前言 在许多应用程序中&#xff0c;更新资源的状态是一项常见的需求。例如&#xff0c;在任务管理系统中&#xff0c;用户可能需要更新任务的状态&#xff0c;如从“待办”变为“完成”。为了实现这一功能&#xff0c;我们可以使用Spring MVC框架结合MyBatis Plus来创建一个简…

《第三十章 性能优化 - 存储优化》

一、引言 在 Android 应用开发中&#xff0c;性能优化是一个持续且重要的工作。存储优化作为性能优化的关键环节之一&#xff0c;对于提高应用的响应速度、节省资源以及提升用户体验具有重要意义。在本章中&#xff0c;我们将重点探讨数据库优化和缓存策略这两个主要知识点。 二…

go+gin+vue入门

后端框架 1、安装go、goland 2、创建空项目 3、下载要用的包&#xff1a;命令行输入go get -u github.com/xxxx 4、安装mysql数据库&#xff0c;使用navicat创建数据库。 5、按照项目框架搭建目录、文件、代码&#xff1a;如router、model… 6、运行测试&#xff0c;go run ma…

JVM面试(一)什么是虚拟机?什么是class文件?

什么是java虚拟机&#xff1f; 如果通俗点来讲&#xff0c;我们在电脑上一行行敲出来的代码&#xff0c;电脑本身是不认识的&#xff0c;最终是要转成电脑可以运行的101001这种字节。 但是这些我们又不可能手动来转换&#xff0c;所以呢&#xff0c;就需要一个工具&#xff0…

学习笔记——后端项目中的相关技术 【随时更新】

文章目录 1. Session 共享1.0 cookie和session的工作流1.1 Cookie范围1.2 为什么要共享&#xff1f;1.3 如何共享存储1.4 session共享实现 2. 缓存的实现2.1 缓存分类2. 2 Redis 缓存实现2.1.1 Redis 的数据结构&#xff08;高频考点&#xff09;2.1.2 redisTemplate 自定义序列…

【Linux】CodeServer:离线插件配置

下载 VS Code 插件 要为 code-server 添加离线插件&#xff0c;首先需要从 Visual Studio Code 插件市场下载所需的插件&#xff1a; 打开浏览器&#xff0c;访问 Visual Studio Code 插件市场。 在搜索栏中输入您需要的插件名称&#xff0c;找到插件后&#xff0c;点击插件页…

“线程池中线程异常后:销毁还是复用?”

目录 一、验证execute提交线程池中 测试 结论 二、验证submit提交线程池中 测试 结论 三、源码解析 查看submit方法的执行逻辑 查看execute方法的执行逻辑 为什么submit方法&#xff0c;没有创建新的线程&#xff0c;而是继续复用原线程&#xff1f; 四、总结 需要说…

经典大语言模型解读(2):生成式预训练的先锋GPT-1

论文地址&#xff1a;Improving Language Understanding by Generative Pre-Training 概述 现实世界中包含了大量的文本语料数据&#xff0c;然而&#xff0c;绝大多数语料都是无标签的。 为了充分利用这些无标签语料库&#xff0c;GPT1.0提出直接利用这些未标记的语料来进行…