亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

詳解spring boot rest例子

2024-07-14 08:40:11
字體:
來源:轉載
供稿:網友

簡介:本文將幫助您使用 Spring Boot 創建簡單的 REST 服務。

你將學習

  1. 什么是 REST 服務?
  2. 如何使用 Spring Initializr 引導創建 Rest 服務應用程序?
  3. 如何創建獲取 REST 服務以檢索學生注冊的課程?
  4. 如何為學生注冊課程創建 Post REST 服務?
  5. 如何利用 postman 執行 rest 服務?

本教程使用的 rest 服務

在本教程中,我們將使用適當的 URI 和 HTTP 方法創建三個服務:

@GetMapping(“/ students / {studentId} / courses”):您可以使用請求方法 Get 和示例 uri / students / Student1 / courses 來查詢特定學生已注冊的課程。

@GetMapping(“/students/{studentId}/courses/{courseId}”):您可以使用請求方法 Get 和示例 uri / students / Student1 / courses / Course1 獲取特定學生的特定課程。

@PostMapping(“/students/{studentId}/courses”) :您可以通過向 UURI /students/Student1/courses 發送 POST 請求來為學生注冊一門課程

您將需要的工具

  1. Maven 3.0+ 是您的構建工具
  2. 你最喜歡的 IDE。我們使用 Eclipse。
  3. JDK 1.8+

 完整的 spring booot rest Maven 項目代碼示例子

我們的 Github 存儲庫包含所有代碼示例 - https://github.com/in28minutes/in28minutes.github.io/tree/master/code-zip-files

帶有單元和集成測試的 REST 服務

Website-springbootrestservices-simplerestserviceswithunitandintegrationtests.zip

 什么是 REST?

REST 代表 REpresentational State Transfer。REST 指定了一組體系結構約束。任何滿足以下這些條件的服務都稱為 RESTful 服務。

RESTful Web Service 的五個重要條件:

  1. 客戶端 - 服務器:應該有一個服務生產者和一個服務使用者。
  2. 接口(URL)是統一的并且暴露資源。
  3. 該服務是無狀態的。
  4. 服務結果應該是可緩存的。例如 HTTP 緩存。
  5. 服務應該采用分層架構??蛻舳瞬粦撝苯舆B接到服務器 - 它可能從中間層獲取信息 - 緩存。

 理查森成熟度模型

Richardson 成熟度模型用于識別 Restful Web Service 的成熟度級別。以下是不同級別和特點:

級別 0:以 REST 風格公開 SOAP Web 服務。公開的操作使用 REST 服務(http:// server / getPosts,http:// server / deletePosts,http:// server / doThis,http:// server / doThat 等)。

級別 1:使用正確的 URI(使用名詞)公開資源。例如:http:// server / accounts,http:// server / accounts / 10。但是,HTTP 方法并未使用。

級別 2:資源使用正確的 URI + HTTP 方法。例如,要更新一個賬戶,你需要做一個 PUT。創建一個帳戶,你做一個 POST。Uri 看起來像 posts/1/comments/5 和 accounts/1/friends/1.

等級 3:HATEOAS (Hypermedia as the engine of application state)。您不僅可以了解所請求的信息,還可以了解服務消費者可以采取的下一個可能的操作。當請求有關 Facebook 用戶的信息時,REST 服務可以返回用戶詳細信息以及有關如何獲取他最近的帖子,如何獲取他最近的評論以及如何檢索他朋友的列表的信息。

使用適當的請求方法

始終使用 HTTP 方法。有關每種 HTTP 方法的最佳做法如下所述:

GET:不應該更新任何東西。應該是冪等的(多次調用相同的結果)??赡艿姆祷卮a 200(OK)+ 404(NOT FOUND)+400(BAD REQUEST)

POST:應該創建新的資源。理想情況下返回 JSON 和鏈接到新創建的資源。盡可能使用相同的返回碼。另外:返回碼 201(創建)是可能的。

PUT:更新已知資源。例如:更新客戶詳細信息??赡艿姆祷卮a:200(OK)

DELETE:用于刪除資源。

項目結構

以下屏幕截圖顯示了我們將創建的項目的結構。

spring,boot,rest

一些細節:

  1. StudentController.java - rest 控制器提供上面討論的所有三種服務方法。
  2.  Course.java, Student.java, StudentService.java - 應用程序的業務邏輯。StudentService 提供了一些我們從 Rest 控制器中消耗的方法。
  3. StudentControllerIT.java - rest 服務的集成測試。
  4. StudentControllerTest.java - test 服務的單元測試。
  5. StudentServicesApplication.java - Spring Boot 應用程序的啟動器。要運行該應用程序,只需將該文件作為 Java 應用程序啟動。
  6. pom.xml - 包含構建此項目所需的所有依賴。我們將使用 Spring Boot Starter Web。

使用 Spring Initializr 引導創建 REST 服務

用 Spring Initializr 創建一個 REST 服務是非常的容易小菜一碟。我們將使用 Spring Web MVC 作為我們的 web 層框架。

Spring Initializr http://start.spring.io/ 是引導創建 Spring Boot 項目的好工具。

spring,boot,rest

如上圖所示,必須執行以下步驟

啟動 Spring Initializr 并選擇以下內容

選擇 com.in28minutes.springboot 為 Group

選擇 student-services 為 Artifact

選擇以下依賴項

  1.  Web
  2. Actuator
  3. DevTools

點擊生成項目。

將項目導入 Eclipse。文件 - > 導入 - > 現有的 Maven 項目。

如果你想了解這個項目的所有文件,你可以繼續向下閱讀。

應用業務層實現

所有應用都需要數據。我們將使用 ArrayList 這種內存數據存儲,而不是與真實數據庫交互。

一名學生可以參加多門課程。課程有一個 ID,名稱,說明和完成課程需要完成的步驟列表。學生有一個身份證,姓名,說明和他 / 她目前注冊的課程列表。StudentService 提供以下公開方法

public List retrieveAllStudents() - 檢索所有學生的詳細信息

public Student retrieveStudent(String studentId) - 檢索特定的學生詳細信息

public List retrieveCourses(String studentId) - 檢索學生注冊的所有課程

public Course retrieveCourse(String studentId, String courseId) - 檢索學生注冊的特定課程的詳細信息

public Course addCourse(String studentId, Course course) - 為現有學生添加課程

請參閱下面這些文件,具體的實現服務類 StudentService 和模型類 Course 和 Student。

  1. src/main/java/com/in28minutes/springboot/model/Course.java
  2. src/main/java/com/in28minutes/springboot/model/Student.java
  3. src/main/java/com/in28minutes/springboot/service/StudentService.java

添加幾個 GET Rest 服務

Rest 服務 StudentController 暴露了幾個 get 服務。

  1. @Autowired private StudentService studentService :我們使用 Spring Autowiring 將 student 服務自動注入到 StudentController。
  2. @GetMapping(“/students/{studentId}/courses”):以 studentId 作為路徑變量公開獲取服務
  3.  @GetMapping(“/students/{studentId}/courses/{courseId}”):公開獲取服務以檢索學生的特定課程。
  4. @PathVariable String studentId:來自 uri 的 studentId 的值將映射到此參數。
package com.in28minutes.springboot.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import com.in28minutes.springboot.model.Course;import com.in28minutes.springboot.service.StudentService;@RestControllerpublic class StudentController {	@Autowired	private StudentService studentService;	@GetMapping("/students/{studentId}/courses")	public List<Course> retrieveCoursesForStudent(@PathVariable String studentId) {		return studentService.retrieveCourses(studentId);	}		@GetMapping("/students/{studentId}/courses/{courseId}")	public Course retrieveDetailsForCourse(@PathVariable String studentId,			@PathVariable String courseId) {		return studentService.retrieveCourse(studentId, courseId);	}}

使用 Postman 執行獲取服務

我們將向 http:// localhost:8080 / students / Student1 / courses / Course1 發起請求以測試該服務。回應如下所示。

{ "id": "Course1", "name": "Spring", "description": "10 Steps", "steps": [  "Learn Maven",  "Import Project",  "First Example",  "Second Example" ]}

下面的圖片顯示了我們如何執行 Postman 的 Get Service - 我最喜歡的運行 rest 服務的工具。

spring,boot,rest

添加 POST Rest 服務

當資源創建成功時,POST 服務應該返回創建的狀態(201)。

  1. @PostMapping(“/students/{studentId}/courses”):為 POST 請求映射 URL
  2. @RequestBody Course newCourse:使用綁定將請求正文綁定到課程對象。
  3. ResponseEntity.created(location).build():返回已創建的狀態。還將創建資源的位置作為響應標題返回。
@PostMapping("/students/{studentId}/courses")	public ResponseEntity<Void> registerStudentForCourse(			@PathVariable String studentId, @RequestBody Course newCourse) {		Course course = studentService.addCourse(studentId, newCourse);		if (course == null)			return ResponseEntity.noContent().build();		URI location = ServletUriComponentsBuilder.fromCurrentRequest().path(				"/{id}").buildAndExpand(course.getId()).toUri();		return ResponseEntity.created(location).build();	}

執行 POST Rest 服務

示例請求如下所示。它包含了學生注冊課程的所有細節。

{ "name": "Microservices", "description": "10 Steps", "steps": [  "Learn How to Break Things Up",  "Automate the hell out of everything",  "Have fun" ]}

下圖顯示了我們如何從 Postman 執行 Post 服務 - 我最喜歡的運行 rest 服務的工具。確保你去 Body 選項卡并選擇 raw。從下拉菜單中選擇 JSON。將上述請求復制到 body 中。

我們使用的 URL 是 http:// localhost:8080 / students / Student1 / courses。

spring,boot,rest

完整的代碼示例

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">	<modelVersion>4.0.0</modelVersion>	<groupId>com.in28minutes.springboot</groupId>	<artifactId>student-services</artifactId>	<version>0.0.1-SNAPSHOT</version>	<packaging>jar</packaging>	<name>student-services</name>	<description>Demo project for Spring Boot</description>	<parent>		<groupId>org.springframework.boot</groupId>		<artifactId>spring-boot-starter-parent</artifactId>		<version>1.4.4.RELEASE</version>		<relativePath/> <!-- lookup parent from repository -->	</parent>	<properties>		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>		<java.version>1.8</java.version>	</properties>	<dependencies>		<dependency>			<groupId>org.springframework.boot</groupId>			<artifactId>spring-boot-starter-actuator</artifactId>		</dependency>		<dependency>			<groupId>org.springframework.boot</groupId>			<artifactId>spring-boot-starter-web</artifactId>		</dependency>		<dependency>			<groupId>org.springframework.boot</groupId>			<artifactId>spring-boot-devtools</artifactId>			<scope>runtime</scope>		</dependency>		<dependency>			<groupId>org.springframework.boot</groupId>			<artifactId>spring-boot-starter-test</artifactId>			<scope>test</scope>		</dependency>	</dependencies>	<build>		<plugins>			<plugin>				<groupId>org.springframework.boot</groupId>				<artifactId>spring-boot-maven-plugin</artifactId>			</plugin>		</plugins>	</build></project>

src/main/java/com/in28minutes/springboot/controller/StudentController.java

import java.net.URI;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.ResponseEntity;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.servlet.support.ServletUriComponentsBuilder;import com.in28minutes.springboot.model.Course;import com.in28minutes.springboot.service.StudentService;@RestControllerpublic class StudentController {	@Autowired	private StudentService studentService;	@GetMapping("/students/{studentId}/courses")	public List<Course> retrieveCoursesForStudent(@PathVariable String studentId) {		return studentService.retrieveCourses(studentId);	}		@GetMapping("/students/{studentId}/courses/{courseId}")	public Course retrieveDetailsForCourse(@PathVariable String studentId,			@PathVariable String courseId) {		return studentService.retrieveCourse(studentId, courseId);	}		@PostMapping("/students/{studentId}/courses")	public ResponseEntity<Void> registerStudentForCourse(			@PathVariable String studentId, @RequestBody Course newCourse) {		Course course = studentService.addCourse(studentId, newCourse);		if (course == null)			return ResponseEntity.noContent().build();		URI location = ServletUriComponentsBuilder.fromCurrentRequest().path(				"/{id}").buildAndExpand(course.getId()).toUri();		return ResponseEntity.created(location).build();	}}

src/main/java/com/in28minutes/springboot/model/Course.java

import java.util.List;public class Course {	private String id;	private String name;	private String description;	private List<String> steps;	// Needed by Caused by: com.fasterxml.jackson.databind.JsonMappingException:	// Can not construct instance of com.in28minutes.springboot.model.Course:	// no suitable constructor found, can not deserialize from Object value	// (missing default constructor or creator, or perhaps need to add/enable	// type information?)	public Course() {	}	public Course(String id, String name, String description, List<String> steps) {		super();		this.id = id;		this.name = name;		this.description = description;		this.steps = steps;	}	public String getId() {		return id;	}	public void setId(String id) {		this.id = id;	}	public String getDescription() {		return description;	}	public String getName() {		return name;	}	public List<String> getSteps() {		return steps;	}	@Override	public String toString() {		return String.format(				"Course [id=%s, name=%s, description=%s, steps=%s]", id, name,				description, steps);	}	@Override	public int hashCode() {		final int prime = 31;		int result = 1;		result = prime * result + ((id == null) ? 0 : id.hashCode());		return result;	}	@Override	public boolean equals(Object obj) {		if (this == obj)			return true;		if (obj == null)			return false;		if (getClass() != obj.getClass())			return false;		Course other = (Course) obj;		if (id == null) {			if (other.id != null)				return false;		} else if (!id.equals(other.id))			return false;		return true;	}}

src/main/java/com/in28minutes/springboot/model/Student.java

package com.in28minutes.springboot.model;import java.util.List;public class Student {	private String id;	private String name;	private String description;	private List<Course> courses;	public Student(String id, String name, String description,			List<Course> courses) {		super();		this.id = id;		this.name = name;		this.description = description;		this.courses = courses;	}	public String getId() {		return id;	}	public void setId(String id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public String getDescription() {		return description;	}	public void setDescription(String description) {		this.description = description;	}	public List<Course> getCourses() {		return courses;	}	public void setCourses(List<Course> courses) {		this.courses = courses;	}	@Override	public String toString() {		return String.format(				"Student [id=%s, name=%s, description=%s, courses=%s]", id,				name, description, courses);	}}

src/main/java/com/in28minutes/springboot/service/StudentService.java

package com.in28minutes.springboot.service;import java.math.BigInteger;import java.security.SecureRandom;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import org.springframework.stereotype.Component;import com.in28minutes.springboot.model.Course;import com.in28minutes.springboot.model.Student;@Componentpublic class StudentService {	private static List<Student> students = new ArrayList<>();	static {		//Initialize Data		Course course1 = new Course("Course1", "Spring", "10 Steps", Arrays				.asList("Learn Maven", "Import Project", "First Example",						"Second Example"));		Course course2 = new Course("Course2", "Spring MVC", "10 Examples",				Arrays.asList("Learn Maven", "Import Project", "First Example",						"Second Example"));		Course course3 = new Course("Course3", "Spring Boot", "6K Students",				Arrays.asList("Learn Maven", "Learn Spring",						"Learn Spring MVC", "First Example", "Second Example"));		Course course4 = new Course("Course4", "Maven",				"Most popular maven course on internet!", Arrays.asList(						"Pom.xml", "Build Life Cycle", "Parent POM",						"Importing into Eclipse"));		Student ranga = new Student("Student1", "Ranga Karanam",				"Hiker, Programmer and Architect", new ArrayList<>(Arrays						.asList(course1, course2, course3, course4)));		Student satish = new Student("Student2", "Satish T",				"Hiker, Programmer and Architect", new ArrayList<>(Arrays						.asList(course1, course2, course3, course4)));		students.add(ranga);		students.add(satish);	}	public List<Student> retrieveAllStudents() {		return students;	}	public Student retrieveStudent(String studentId) {		for (Student student : students) {			if (student.getId().equals(studentId)) {				return student;			}		}		return null;	}	public List<Course> retrieveCourses(String studentId) {		Student student = retrieveStudent(studentId);		if (student == null) {			return null;		}		return student.getCourses();	}	public Course retrieveCourse(String studentId, String courseId) {		Student student = retrieveStudent(studentId);		if (student == null) {			return null;		}		for (Course course : student.getCourses()) {			if (course.getId().equals(courseId)) {				return course;			}		}		return null;	}	private SecureRandom random = new SecureRandom();	public Course addCourse(String studentId, Course course) {		Student student = retrieveStudent(studentId);		if (student == null) {			return null;		}		String randomId = new BigInteger(130, random).toString(32);		course.setId(randomId);		student.getCourses().add(course);		return course;	}}

src/main/java/com/in28minutes/springboot/StudentServicesApplication.java

package com.in28minutes.springboot;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class StudentServicesApplication {	public static void main(String[] args) {		SpringApplication.run(StudentServicesApplication.class, args);	}}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91免费看国产| 日韩中文字幕久久| 欧美日韩福利视频| 欧美性高跟鞋xxxxhd| 亚州成人av在线| 国外视频精品毛片| 国产精品激情av电影在线观看| 在线视频欧美性高潮| 亚洲色图第三页| 国产精品一区二区在线| 欧美亚洲免费电影| 亚洲午夜精品久久久久久久久久久久| 亚洲性线免费观看视频成熟| 日本电影亚洲天堂| 久久久精品999| 久久视频中文字幕| 欧美黑人又粗大| 日韩在线www| 国产自产女人91一区在线观看| 亚洲欧洲一区二区三区在线观看| 亚洲xxxx在线| 国产精品久久久久不卡| 久久精品一区中文字幕| 久久国产加勒比精品无码| 亚洲男人的天堂在线| 亚洲国产美女久久久久| 亚洲最大激情中文字幕| 在线观看日韩欧美| www.日韩不卡电影av| 亚洲精品大尺度| 久久精品色欧美aⅴ一区二区| 国产乱肥老妇国产一区二| 久久免费少妇高潮久久精品99| 国产91在线播放| 亚洲精品98久久久久久中文字幕| 亚洲xxx大片| 欧美视频中文在线看| 国产欧美精品日韩| 亚洲精品美女网站| 9.1国产丝袜在线观看| 亚洲第一精品久久忘忧草社区| 久久久久国色av免费观看性色| 欧美最顶级丰满的aⅴ艳星| 国产精品中文字幕久久久| 欧美高清视频在线播放| 亚洲无av在线中文字幕| 亚洲免费影视第一页| 性欧美在线看片a免费观看| 国产日韩欧美视频在线| 国产精品日韩精品| 亚洲va男人天堂| 色久欧美在线视频观看| 26uuu日韩精品一区二区| 日韩精品在线第一页| 欧美精品一区二区免费| 欧美精品久久久久久久免费观看| 欧美亚洲成人免费| 2019中文字幕在线观看| 91天堂在线观看| 国模精品一区二区三区色天香| 日韩欧美aⅴ综合网站发布| 国产视频自拍一区| 91亚洲精品久久久久久久久久久久| 668精品在线视频| 欧美午夜性色大片在线观看| 国产精品久久久久77777| 成人h视频在线观看播放| 欧美一级高清免费| 欧美精品少妇videofree| 国产日韩欧美中文在线播放| 欧美做受高潮1| 中文字幕久热精品视频在线| 国产精品久久久久久搜索| 亚洲最大av网| 最新69国产成人精品视频免费| 欧美电影免费观看电视剧大全| 日韩国产欧美精品一区二区三区| 91精品国产91久久久久久最新| 欧美体内谢she精2性欧美| 日韩免费看的电影电视剧大全| 日韩免费中文字幕| 91天堂在线视频| 成人av在线亚洲| 国产成人一区二区| 亚洲人成在线观| 久久激情视频久久| 国产美女扒开尿口久久久| 国产精品国产亚洲伊人久久| 欧美猛男性生活免费| 成人在线中文字幕| 国产乱肥老妇国产一区二| 日韩中文在线观看| 97在线日本国产| 亚洲一区中文字幕在线观看| 午夜免费久久久久| 欧美日韩激情小视频| 中文字幕亚洲激情| 日韩视频在线观看免费| 91av在线视频观看| 国产精品福利网站| 欧美激情第6页| 欧美性xxxx极品hd欧美风情| 欧美日韩综合视频| 久久久国产在线视频| 日本乱人伦a精品| 亚洲精品福利资源站| 午夜精品久久久久久久男人的天堂| 欧美裸体男粗大视频在线观看| 国产精品激情自拍| 国产精品一区二区av影院萌芽| 亚洲区在线播放| 久久久久亚洲精品国产| 国产成人aa精品一区在线播放| 蜜臀久久99精品久久久无需会员| 中文字幕日韩在线观看| 久久中文字幕国产| 日韩国产在线看| 亚洲精品美女久久久| 久久久久国产视频| 亚洲精品国产美女| 日韩少妇与小伙激情| 国产盗摄xxxx视频xxx69| 午夜精品福利在线观看| 中文字幕欧美在线| 欧美一级大片视频| 57pao成人永久免费视频| 欧美野外猛男的大粗鳮| 欧美在线免费观看| 日韩大陆欧美高清视频区| 日韩精品在线视频观看| 欧美激情一二区| 欧美性视频在线| 欧美另类极品videosbest最新版本| 精品呦交小u女在线| 日韩电影在线观看免费| 中文字幕欧美国内| 欧美日韩性生活视频| 91av成人在线| 欧美另类极品videosbest最新版本| 国内精品久久久久影院优| 精品国产一区二区三区四区在线观看| 亚洲无av在线中文字幕| 日韩av电影手机在线| 国产精品欧美日韩一区二区| 黑人巨大精品欧美一区二区一视频| 8090成年在线看片午夜| 成人观看高清在线观看免费| 国产成人短视频| 欧美壮男野外gaytube| 亚洲免费福利视频| 97免费视频在线播放| 亚洲精品国产电影| 日韩欧美在线免费| 久久精品一偷一偷国产| 九九久久久久久久久激情| 色妞色视频一区二区三区四区| 91成人性视频| 91精品久久久久久久久| 国产成人精品日本亚洲专区61| 国产精品久久婷婷六月丁香| 亚洲欧美综合v| 国产精品一二三在线| 日韩视频在线免费观看| 一区二区三区天堂av|