使用Spring Boot開發(fā)Restful程序

一弟跑、簡介

最近團隊中Android和IOS的童鞋向我提出來一個要求灾前,想學習一下服務端是如何開發(fā)的。我們的后端主要是用Spring MVC來實現(xiàn)Restful風格的接口孟辑,業(yè)務層和數(shù)據(jù)層使用Spring Framework+Mybatis來實現(xiàn)哎甲。但是這些東西一來配置文件太多,原理也很難快速掌握饲嗽,對于前端童鞋來說炭玫,門檻較高,有沒有更便捷的框架供大家學習呢貌虾?經過幾天的時間研究吞加,終于找到了Spring Boot這個大殺器。

Spring Boot 是由Pivotal團隊提供的全新框架尽狠,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程衔憨。該框架使用了特定的方式來進行配置,從而使開發(fā)人員不再需要定義樣板化的配置晚唇。通過這種方式巫财,Boot致力于在蓬勃發(fā)展的快速應用開發(fā)領域(rapid application development)成為領導者。

Spring Boot不生成代碼哩陕,且完全不需要XML配置平项。其主要目標如下:

  • 為所有的Spring開發(fā)工作提供一個更快赫舒、更廣泛的入門經驗。
  • 開箱即用闽瓢,你也可以通過修改默認值來快速滿足你的項目的需求接癌。
  • 提供了一系列大型項目中常見的非功能性特性,如嵌入式服務器扣讼、安全缺猛、指標,健康檢測椭符、外部配置等荔燎。

Spring Boot官網: http://projects.spring.io/spring-boot/

二、開發(fā)環(huán)境準備

我將以一個用戶積分系統(tǒng)為例销钝,開發(fā)一個Restful風格的服務端

三有咨、第一個Restful程序

1.新建一個普通Maven工程


Step1

Step2

Step3

Step4

創(chuàng)建項目完成后目錄結構如下圖所示


Step5

2.在POM文件中加入對Spring-Boot的依賴

<?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.bluecoffee</groupId>
    <artifactId>mapp</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <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>
</project>

3.新建一個RestController來接收客戶端的請求,我們來模擬一個登錄請求

package com.yepit.mapp.rest;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.*;

/**
 * Created by qianlong on 16/7/20.
 */
@RestController
public class UserController {

    @RequestMapping(value = "/users/{username}",method = RequestMethod.GET,consumes="application/json")
    public String getUser(@PathVariable String username, @RequestParam String pwd){
        return "Welcome,"+username;
    }}
  • 關鍵字@RestController代表這個類是用Restful風格來訪問的蒸健,如果是普通的WEB頁面訪問跳轉時座享,我們通常會使用@Controller
  • value = "/users/{username}" 代表訪問的URL是"http://host:PORT/users/實際的用戶名"
  • method = RequestMethod.GET 代表這個HTTP請求必須是以GET方式訪問
  • consumes="application/json" 代表數(shù)據(jù)傳輸格式是json
  • @PathVariable將某個動態(tài)參數(shù)放到URL請求路徑中
  • @RequestParam指定了請求參數(shù)名稱

4.新建啟動Restful服務端的啟動類

package com.yepit.mapp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Created by qianlong on 16/7/20.
 */
@SpringBootApplication
public class MappRunApplication {

    public static void main(String[] args) {
        SpringApplication.run(MappRunApplication.class, args);
    }
}

5.執(zhí)行MappRunApplication的Main方法啟動Restful服務,可以看到控制臺有如下輸出

  .   ____          _            __ _ _
 /\\\\ / ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\
( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\
 \\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.3.3.RELEASE)

2016-07-20 16:49:43.334  INFO 2106 --- [           main] com.yepit.mapp.MappRunApplication        : Starting MappRunApplication on bogon with PID 2106 (/Users/qianlong/workspace/spring-boot-samples/target/classes started by qianlong in /Users/qianlong/workspace/spring-boot-samples)
2016-07-20 16:49:43.338  INFO 2106 --- [           main] com.yepit.mapp.MappRunApplication        : No active profile set, falling back to default profiles: default
2016-07-20 16:49:43.557  INFO 2106 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@543e710e: startup date [Wed Jul 20 16:49:43 CST 2016]; root of context hierarchy
2016-07-20 16:49:44.127  INFO 2106 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'beanNameViewResolver' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2016-07-20 16:49:44.658  INFO 2106 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2016-07-20 16:49:44.672  INFO 2106 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2016-07-20 16:49:44.673  INFO 2106 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.0.32
2016-07-20 16:49:44.759  INFO 2106 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2016-07-20 16:49:44.759  INFO 2106 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1207 ms
2016-07-20 16:49:44.972  INFO 2106 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2016-07-20 16:49:44.977  INFO 2106 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'characterEncodingFilter' to: [/*]
2016-07-20 16:49:44.978  INFO 2106 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2016-07-20 16:49:44.978  INFO 2106 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2016-07-20 16:49:44.978  INFO 2106 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'requestContextFilter' to: [/*]
2016-07-20 16:49:45.184  INFO 2106 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@543e710e: startup date [Wed Jul 20 16:49:43 CST 2016]; root of context hierarchy
2016-07-20 16:49:45.251  INFO 2106 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/users],methods=[GET],consumes=[application/json]}" onto public java.lang.String com.yepit.mapp.rest.UserController.getUser(java.lang.String,java.lang.String)
2016-07-20 16:49:45.253  INFO 2106 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2016-07-20 16:49:45.254  INFO 2106 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2016-07-20 16:49:45.275  INFO 2106 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-07-20 16:49:45.275  INFO 2106 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-07-20 16:49:45.306  INFO 2106 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-07-20 16:49:45.380  INFO 2106 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2016-07-20 16:49:45.462  INFO 2106 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2016-07-20 16:49:45.467  INFO 2106 --- [           main] com.yepit.mapp.MappRunApplication        : Started MappRunApplication in 2.573 seconds (JVM running for 3.187)

我們可以看到服務器是Tomcat似忧,端口為8080

6.驗證
推薦大家使用Google的Postman插件來模擬請求

模擬請求

在發(fā)起請求前渣叛,請注意需要在Headers中設置Content-Type為application/json

到此一個基本的Restful風格的服務端就已經完成了,全部編碼時間不會超過5分鐘盯捌!

完整代碼戳這里: Chapter 1 - 5分鐘構建一個基本的Restful程序

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末淳衙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子挽唉,更是在濱河造成了極大的恐慌滤祖,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓶籽,死亡現(xiàn)場離奇詭異匠童,居然都是意外死亡,警方通過查閱死者的電腦和手機塑顺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門汤求,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人严拒,你說我怎么就攤上這事扬绪。” “怎么了裤唠?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵挤牛,是天一觀的道長。 經常有香客問我种蘸,道長墓赴,這世上最難降的妖魔是什么竞膳? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮诫硕,結果婚禮上坦辟,老公的妹妹穿的比我還像新娘。我一直安慰自己章办,他們只是感情好锉走,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藕届,像睡著了一般挪蹭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上休偶,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天嚣潜,我揣著相機與錄音,去河邊找鬼椅贱。 笑死,一個胖子當著我的面吹牛只冻,可吹牛的內容都是我干的庇麦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼喜德,長吁一口氣:“原來是場噩夢啊……” “哼山橄!你這毒婦竟也來了?” 一聲冷哼從身側響起舍悯,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤航棱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后萌衬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饮醇,經...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年秕豫,在試婚紗的時候發(fā)現(xiàn)自己被綠了朴艰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡混移,死狀恐怖祠墅,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情歌径,我是刑警寧澤毁嗦,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站回铛,受9級特大地震影響狗准,放射性物質發(fā)生泄漏克锣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一驶俊、第九天 我趴在偏房一處隱蔽的房頂上張望娶耍。 院中可真熱鬧,春花似錦饼酿、人聲如沸榕酒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽想鹰。三九已至,卻和暖如春药版,著一層夾襖步出監(jiān)牢的瞬間辑舷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工槽片, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留何缓,地道東北人。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓还栓,卻偏偏與公主長得像碌廓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子剩盒,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內容