網上有很多springboot的入門教程,自己也因為項目要使用springboot,所以利用業余時間自學了下springboot和springcloud,使用下來發現springboot還是挺簡單的,體現了極簡的編程風格,大部分通用都是通過注解就可以完成,下面就來詳細講解下如何使用springboot來開發一個簡單的restful api網關功能,可以提供給H5或者android、ios進行接口開發,還是很方便的。
1. 使用spring initialization創建SpringBoot項目
有很多方法可以快速創建Springboot項目,可以通過idea的springboot initialization來創建,也可以通過手工新建一個maven工程,然后引入springboot的dependency來完成sprignboot的工程導入,還可以通過spring官網的來創建springboot項目,因為有些同學可能沒裝idea,這里就通過官網的工程初始化指引來創建一個springboot空工程。
首先輸入網址 https://start.spring.io,打開后可以看到下圖:
加入web組件后,點擊下方的綠色按鈕Generate Project即可創建一個springboot工程,並且自動下載到本地,接下來直接在idea或者eclipse打開該工程就可以了,在創建的時候可以選擇Maven工程或者Gradle工程,這里我們使用了大家比較熟悉的Maven工程
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.7.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-web</artifactId> </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>
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
SpringBootStartApplication.java
@SpringBootApplication
public class SpringbootStartApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootStartApplication.class, args);
}
}
所有的springboot application啟動類都需要在類級別上加上@SpringBootApplication注解,其他參數不用任何調整,后續可以把一些初始化的動作放到該類中進行,目前本例中就不加其他的啟動加載項了。
這樣一個api網關的架子就搭好了,是不是很簡單!下面我們就可以將主要精力聚焦在業務邏輯代碼上了,這里為了簡化程序,不會將項目進行深入的分層設計,在實際項目中,一般都會對項目進行分層設計,如果是api網關,沒有view層但是起碼也會有對外接入decontroller層、處理業務邏輯的service層、處理數據持久化的dao層,同時也會有一些POJO業務實體類,這里就不詳細展開了,后續也會對互聯網架構設計進行詳細講述,這里我們只創建了一個UserController類,里面只有獲取用戶信息的方法,分別根據參數和請求方式的不同用三種方法進行了重寫,下面就來一一道來。
先來講述下最簡單的使用get請求用戶信息的實現方式,代碼如下,寫好后直接在Application類點擊右鍵有個RunAs,點擊后會自動運行,運行成功后可以使用http發包工具進行測試,這里推薦使用chrome的postman或者使用firefox的httprequester插件,都是比較簡單的發包工具,get請求的上送為http://localhost:8081/springboot/getUserByGet?userName=feiweiwei
//@RestController注解能夠使項目支持Rest @RestController @SpringBootApplication //表示該controller類下所有的方法都公用的一級上下文根 @RequestMapping(value = "/springboot") public class UserController { //這里使用@RequestMapping注解表示該方法對應的二級上下文路徑 @RequestMapping(value = "/getUserByGet", method = RequestMethod.GET) String getUserByGet(@RequestParam(value = "userName") String userName){ return "Hello " + userName; } }
這里用到的注解主要有@RequestMapping表示請求的URL上下文路徑,該路徑不能重復,為了保證與團隊其他同事寫的不重復,一般會在每個controller前面加一個一級上下文目錄,具體路徑參數放在value后面,在每個方法前加一個二級目錄,這樣可以有效的避免路徑沖突。還有注解是@RequestParam,該注解可以通過value指定入參,這里return的返回值就是實際的接口返回。
下面介紹下POST的請求方式,可以通過在@RequestMapping注解中設置method為POST來表示該請求為POST請求,除了get、post還有put、delete等請求方式,都可以通過該參數設置。
//通過RequestMethod.POST表示請求需要時POST方式 @RequestMapping(value = "/getUserByPost", method = RequestMethod.POST) String getUserByPost(@RequestParam(value = "userName") String userName){ return "Hello " + userName; }
//在入參設置@RequestBody注解表示接收整個報文體,這里主要用在接收整個POST請求中的json報文體, //目前主流的請求報文也都是JSON格式了,使用該注解就能夠獲取整個JSON報文體作為入參,使用JSON解析工具解析后獲取具體參數 @RequestMapping(value = "/getUserByJson",method = RequestMethod.POST) String getUserByJson(@RequestBody String data){ return "Json is " + data; }
3. 小結
到此一個簡單的restful風格的api網關就完成了,對於移動開發人員可以自己寫簡單的服務端進行全棧開發了,原來做spring的同學也可以很快上手springboot,springboot總體上來說還是簡化了原先復雜的配置,讓大家更容易快速上手和搭建服務端,代碼的git地址在下方,歡迎大家下載,謝謝。
報錯的原因是jar包版本太高了 改成2.1.1解決
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
關於啟動服務后無法訪問地址,信息如下:
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Sat Jun 29 11:00:06 CST 2019
There was an unexpected error (type=Not Found, status=404).
No message available
解決辦法:
1、引入thymeleaf引擎
查看是否忘記引入了thymeleaf依賴,沒有引入則在mawen的pom.xml文件引入,pom.xml文件的thymeleaf引入如下
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
2、檢查訪問地址是否正確
檢查訪問地址是否寫正確,地址應該為controller的路徑加上RequestMapping的路徑。
如下代碼的訪問地址為:http://localhost:8080/getUList
@Controller public class UlevelController { @RequestMapping(value="getUList", method=RequestMethod.GET) public String getUlevelList() { ……………… return "ulevel/ulevelList"; } }
如下代碼的訪問地址為:http://localhost:8080/hhllow/getUList
@Controller @RequestMapping(value="/hhllow") public class UlevelController { @RequestMapping(value="getUList", method=RequestMethod.GET) public String getUlevelList() { ……………… return "ulevel/ulevelList"; } }
這里順便說明,如果訪問的是hello.html,但是hello.html不存在,不是拋出404的錯誤,而是500的錯誤,如下信息:
Error resolving template "/hello", template might not exist or might not be accessible by
any of the configured Template Resolvers
3、包路徑寫對
application.java文件的包必須是項目下的父路徑,其他類的包路徑必須是其子路徑(同一級目錄也可啟動服務),如:

