SpringBoot之路(7)–開發一個Restful Web項目

啥是Restful

Restful實際上是一種軟件設計風格,但是不是強制約定。Rest風格及通過URL地址+HTTP動詞來操作資源進行增刪改查等操作。

URL地址就是咱們Web服務的地址,HTTP動詞即爲常見的GET,POST,PUT,DELETE。

爲啥要用Restful風格

主要還是規範後端API的規則,如果大家都遵守這種風格開發的話,前後端互相調用或者兩個程序間互相調用的時候比較方便。

如果沒有一種統一的風格,那每調一個接口都得去看文檔,十分麻煩。

那爲啥要用Restful風格呢,因爲這種風格比較流行啊,用的人多,其他公司也在用。如果咱們也採用的話,其他公司也好理解。

隨大流的話,比較容易融入大流。

Restful API到底啥樣

扯了一大堆,來看看Restful風格的API到底是啥樣子,還是以博客的增刪改查爲例,遵循Restful 風格的話,設計如下,注意project表示項目名稱。

動詞 接口含義 接口定義
GET 查詢博客(id=1)信息 http://127.0.0.1/myblog/blog/1
GET 查詢博客列表信息 http://127.0.0.1/myblog/blog
POST 新增博客 http://127.0.0.1/myblog/blog
PUT 修改博客(id=1)信息 http://127.0.0.1/myblog/blog/1
DELETE 刪除博客(id=1) http://127.0.0.1/myblog/blog/1

好的,總結下特點吧,其實也很容易。

  • 動詞方面,查詢GET,新增POST,修改PUT,刪除DELETE。這個還是比較符合大家正常的邏輯的,不過通常我們做項目的時候GET/POST用的比較多,PUT/DELETE用的少,其實沒啥大區別。
  • URL方面,IP、端口、項目路徑這個不用說了,都是固定的。後面具體接口地址部分,都是以概念爲開頭的,即blog(博客),如果涉及該概念的id的話,再加/id。

整一個項目實例咱就明白咧

現在我們完整的來實現一個基於SpringBoot的Restful Web項目,然後說下這個項目是咋弄起來的。

1、創建項目

使用Spring Initializr構建一個項目,然後導入eclipse,這個前面的章節說了,此處不再詳述。

注意項目名稱設爲springboot-restful,表示這是一個SpringBoot的Restful項目,我習慣將項目名稱弄成小寫,至於爲啥加前綴,是因爲如果是一個大項目的話可能包含若干SpringBoot小項目,前綴表示大項目的概念。

此處還是簡單的貼一下構建圖:
圖片描述

2、引入web依賴

既然是開發web項目,直接引入spring-boot-starter-web依賴,開啓web項目自動配置,此時直接就可以開發web項目啦。

		<!-- 添加web開發功能,自動引入web相關的jar包,自動配置web相關的組件,非常強大 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
3、編寫實體類

既然是要對博客進行操作,所以我們至少得有個博客類,面向對象開發麼,對象就是現實社會中真實存在的物體的抽象。扯遠了,定義博客類如下。

public class BlogDo {
	/**
	 * 序號
	 */
	private Long id;
	/**
	 * 標題
	 */
	private String title;
	/**
	 * 內容
	 */
	private String content;
	// 省略get set
}
4、定義服務類

正常情況下我們需要對數據庫操作,來實現博客的增刪改查,本章我們主要是爲了演示Restful Web項目,所以就不具體實現數據庫了,直接寫一個服務類模擬下就行了。

代碼如下,並不複雜,但是此處我們要好好理解下@Service爲啥能爲BlogService類註冊一個名爲blogService的組件。下面是重點哦,好好理解下:

首先BlogService類要與我們項目的啓動類SpringbootRestfulApplication在一個包內,因爲SpringBoot項目啓動之後開啓了自動配置,而且默認掃描啓動類所在包及其子包。

當掃描到BlogService 類時,哎呀,就發現了上面有一個@Service註解,此時Spring就知道:哦,這個類是一個服務組件類,要爲其註冊一個組件放入Spring容器中管理。

然後@Service沒有具體組件命名參數,所以默認就是類名小寫blogService爲組件名,然後Spring容器中就多了一個名爲blogService的組件。

最後,當其他類中有@Autowired BlogService blogService;這樣的代碼時,Spring容器就會根據類型自動裝配了,因爲前面已經註冊了一個BlogService類型的bean,所以就被注入到這個屬性中,可以被調用啦。

@Service // 註冊爲Spring管理的組件
public class BlogService {

	/**
	 * 獲取博客列表
	 */
	public List<BlogDo> getBlogList() {
		List<BlogDo> blogList = new ArrayList<BlogDo>();
		BlogDo blog = new BlogDo();
		blog.setId(1L);
		blog.setTitle("抗擊疫情");
		blog.setContent("兄弟們加油!");
		blogList.add(blog);
		return blogList;
	}

	/**
	 * 按id獲取博客信息,模擬返回對應博客信息
	 */
	public BlogDo getBlogById(Long id) {
		BlogDo blog = new BlogDo();
		blog.setId(1L);
		blog.setTitle("抗擊疫情");
		blog.setContent("兄弟們加油!");
		return blog;
	}

	/**
	 * 新增博客,模擬返回數據庫影響行數
	 */
	public int addBlog(BlogDo blog) {
		return 1;
	}

	/**
	 * 根據博客id更新博客信息,模擬返回數據庫影響行數
	 */
	public int updateBlog(BlogDo blog) {
		return 1;
	}

	/**
	 * 根據博客id刪除對應博客,模擬返回數據庫影響行數
	 */
	public int deleteBlog(Long id) {
		return 1;
	}
}
5、開發控制器類

此時我們可以按照Restful風格編寫控制器類啦,代碼如下,需要注意的我都已經放到註釋中了。

@RestController // 通過該註解,第一將BlogController註冊爲控制器,第二將其中方法返回值轉換爲json
public class BlogController {
	@Autowired // 自動裝配blogService
	private BlogService blogService;
	/**
	 * 查詢博客信息
	 * 1、@GetMapping表示可以使用get方法請求該api
	 * 2、"/blog/{id}"表示請求路徑爲/blog/{id}的形式,其中{id}爲佔位符
	 * 3、@PathVariable("id")表示將佔位符{id}的值傳遞給id
	 * 4、也就是說/blog/123請求的話,會將123傳遞給參數id
	 */
	@GetMapping("/blog/{id}")
	public BlogDo getOne(@PathVariable("id") long id) {
		return blogService.getBlogById(id);
	}
	/**
	 * 查詢博客列表,使用get方法
	 */
	@GetMapping("/blog")
	public List<BlogDo> getList(){
		return blogService.getBlogList();
	}
	/**
	 * 新增博客
	 * 1、@PostMapping表示使用post方法
	 * 2、@RequestBody表示將請求中的json信息轉換爲BlogDo類型的對象信息,該轉換也是由SpringMVC自動完成的
	 */
	@PostMapping("/blog")
	public void add(@RequestBody BlogDo blog) {
		blogService.addBlog(blog);
	}
	/**
	 * 修改博客
	 * 實際上此處也可以不在路徑中傳遞id,而是整個使用json傳遞對象信息,但是我查詢了一些文檔,貌似使用路徑傳遞id更加規範一些,此處不用糾結
	 */
	@PutMapping("/blog/{id}")
	public void update(@PathVariable("id") long id,@RequestBody BlogDo blog) {
		//修改指定id的博客信息
		blog.setId(id);
		blogService.updateBlog(blog);
	}
	/**
	 * 刪除博客
	 */
	@DeleteMapping("/blog/{id}")
	public void delete(@PathVariable("id") long id) {
		blogService.deleteBlog(id);
	}
}
6、啓動項目進行測試

先看下項目整體結構哈。

TIps:控制器類、服務類要放在啓動類所在包及其子包中,不然的話需要手工指定掃描包。

圖片描述

然後修改下配置文件唄,改下啓動端口爲1007吧,這是第7節嘛。

# 配置啓動端口
server.port=1007

啓動項目後,在瀏覽器地址欄輸入http://127.0.0.1:1007/blog/1結果如下

{"id":1,"title":"抗擊疫情","content":"兄弟們加油!"}

在地址欄輸入http://127.0.0.1:1007/blog結果如下

[{"id":1,"title":"抗擊疫情","content":"兄弟們加油!"}]

非常完美吭。

如何更好的測試捏?

因爲瀏覽器地址欄輸入url的方式只能測試Get請求,如果要測試POST/DELETE/PUT,得用一些工具如PostMan,或者編寫前端頁面訪問來測試。

太麻煩咧!我又不是前端工程師,我又不是測試工程師,俺就想試試寫得API行不行,別這麼麻煩行麼。

當然可以咧,SpringBoot就是爲簡化而生,就是這麼人性化。

直接集成Swagger2,自動生成可視化測試界面,而且還可以自動生成在線接口文檔,最關鍵的是: 一點也不難!!!

OK,下一篇就開整SpringBoot中集成Swagger2,順便再測試測試本篇剩下的三個接口。

非常完美吭。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章