Spring Boot 構建一個RESTful Web服務

本指南將指導您使用Spring建立 "Hello, World "RESTful Web服務的過程。java

您將構建的內容

你將創建一個服務,它將接受HTTP GET請求,地址是git

http://localhost:8080/greeting。

它將響應一個JSON表示的問候語,以下面的列表所示。github

{"id":1, "content": "Hello, World!"}

您能夠在查詢字符串中使用可選的名稱參數自定義問候語,以下列表所示。web

http://localhost:8080/greeting?name=User

name參數值會覆蓋World的默認值,並反映在響應中,以下列表所示。spring

{"id":1, "content": "Hello,User!"}

您須要什麼

JDK 1.8或更高版本
Maven 3.2+apache

配置java

下載安裝Java
配置JAVA_HOME = JDK目錄瀏覽器

修改mirror

C:/Users/Administrator/.m2/settings.xml服務器

<settings>
    <mirrors>
        <mirror>
            <id>aliyun</id>
            <name>aliyun</name>
            <mirrorOf>central</mirrorOf>
            <!-- 國內推薦阿里雲的Maven鏡像 -->
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        </mirror>
    </mirrors>
</settings>

快速察看效果

要跳過基本步驟,請執行如下操做。mvc

下載並解壓本指南的源碼庫,或者使用Git克隆:app

git clone https://github.com/spring-guides/gs-rest-service.git。
cd gs-rest-service/complete
mvnw package
java -jar target

而後打開瀏覽器,貼入以下地址:

http://localhost:8080/greeting。

它將響應一個JSON表示的問候語,以下面的列表所示。

{"id":1, "content": "Hello, World!"}

建立腳手架而且打包

使用https://start.spring.io/ 生成一個zip文件,解壓後獲得一個目錄,其內是腳手架代碼
進入目錄,執行:

mvnw package

漫長的執行後,看到BUILD SUCCESS

執行

java –jar target\<JARFILE>

對於全部的Spring應用,你應該從Spring Initializr開始。Initializr提供了一種快速的方法來引入應用程序所需的全部依賴關係,併爲您作了大量的設置。這個例子只須要Spring Web依賴關係。

您能夠直接從Spring Initializr中獲取包含必要依賴項的Maven構建文件。如下列表顯示了選擇Maven時建立的pom.xml文件。

解析

對於全部的Spring應用,你應該從Spring Initializr開始。Initializr提供了一種快速的方法來引入應用程序所需的全部依賴關係,併爲您作了大量的設置。這個例子只須要Spring Web依賴關係。

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>rest-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rest-service</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <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>

建立資源表示類

如今你已經創建了項目和構建系統,你能夠建立你的Web服務。經過思考服務交互開始這個過程。

該服務將處理對/greeting的GET請求,在查詢字符串中可選擇使用名稱參數。GET請求應該返回一個200 OK的響應,在body中包含表明問候語的JSON。它應該相似於下面的輸出。

{
    "id": 1,
    "content"。"Hello,world!"
}

id字段是問候語的惟一標識符,內容是問候語的文本表示。

爲了對問候語的表示進行建模,建立一個資源表示類。爲此,提供一個Java對象,其中包含字段、構造函數以及id和內容數據的訪問器,以下列表所示(來自src/main/java/com/example/restservice/Greeting.java)。

package com.example.restservice;
public class greeting {
    private final long id;
    private final String content.public Greeting(long id, String content.)

    public Greeting(long id, String content) {
        this.id = id.com
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}

該應用程序使用Jackson JSON庫自動將Greeting類型的實例聚集成JSON。web啓動程序默認包含Jackson。

建立一個資源控制器

在Spring構建RESTful Web服務的方法中,HTTP請求由一個控制器處理。這些組件由@RestController註解標識,下面列表中顯示的GreetingController(來自src/main/java/com/example/restservice/GreetingController.java)經過返回Greeting類的新實例來處理對/greeting的GET請求。

package com.example.restservice;

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @GetMapping("/greeting")
    public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
}

這款控制器簡潔明瞭,但在引擎蓋下有不少東西。咱們一步步分解它。

  • 路由綁定。@GetMapping註解確保了對/greeting的HTTP GET請求被映射到greeting()方法。還有其餘HTTP動詞的配套註解(例如:@PostMapping用於POST)。還有一個@RequestMapping註解,它們都是由這個註解派生出來的,能夠做爲一個同義詞(例如@RequestMapping(method=GET))。
  • 查詢參數和函數參數的綁定。@RequestParam將查詢字符串參數名稱的值綁定到greeting()方法的name參數中。若是請求中沒有name參數,則使用World的defaultValue。
  • 返回結果。方法體的實現根據計數器的下一個值建立並返回一個新的Greeting對象,該對象具備id和內容屬性,並經過使用greeting模板對給定的名稱進行格式化。傳統的MVC控制器和前面展現的RESTful Web服務控制器之間的一個關鍵區別是建立HTTP響應體的方式。這個RESTful Web服務控制器不是依靠視圖技術來執行服務器端將問候數據渲染成HTML,而是填充並返回一個Greeting對象。該對象數據將以JSON形式直接寫入HTTP響應。Greeting對象必須被轉換爲JSON。因爲Spring的HTTP消息轉換器支持,您無需手動進行這種轉換。由於Jackson 2在classpath上,因此Spring的MappingJackson2HttpMessageConverter會自動選擇將Greeting實例轉換爲JSON。
  • 控制器表示。這段代碼使用了Spring @RestController註解,它標誌着該類是一個控制器,其中每一個方法都會返回一個域對象而不是視圖。它是包括@Controller和@ResponseBody的簡寫。

App代碼

也看看應用代碼:

package com.example.restservice;

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

@SpringBootApplication
public class RestServiceApplication {

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

}

@SpringBootApplication是一個方便的註解,它添加了如下全部內容。

  • @Configuration: 標記該類做爲應用上下文的Bean定義源。
  • @EnableAutoConfiguration:告訴Spring Boot開始添加bean定義。告訴Spring Boot開始根據classpath設置、其餘Bean和各類屬性設置來添加Bean。例如,若是classpath上有spring-webmvc,這個註解就會將應用程序標記爲web應用程序,並激活關鍵行爲,例如設置DispatcherServlet。
  • @ComponentScan.告訴Spring尋找其餘組件,並激活關鍵行爲,例如設置DispatcherServlet。告訴Spring在com/example包中尋找其餘組件、配置和服務,讓它找到控制器。

main()方法使用Spring Boot的SpringApplication.run()方法來啓動應用程序。你注意到沒有一行XML嗎?也沒有web.xml文件。這個web應用程序是100%純Java的,你不須要處理任何管道或基礎設施的配置。

創建一個可執行的JAR

你能夠用Gradle或Maven從命令行運行應用程序。你也能夠構建一個可執行的JAR文件,其中包含全部必要的依賴關係、類和資源,而後運行它。構建一個可執行的jar,能夠很容易地在整個開發生命週期中,在不一樣的環境中,將服務做爲一個應用來發布、版本和部署,等等。

若是你使用Gradle,你能夠經過使用./gradlew bootRun來運行應用程序。或者,你能夠經過使用./gradlew build來構建JAR文件,而後運行JAR文件,以下所示。

java -jar build/libs/gs-rest-service-0.1.0.jar

若是你使用Maven,你可使用./mvnw spring-boot:run來運行應用程序。另外,你也能夠用./mvnw clean package構建JAR文件,而後運行JAR文件,以下所示。

java -jar target/gs-rest-service-0.1.0.jar

這裏描述的步驟能夠建立一個可運行的JAR。你也能夠創建一個經典的WAR文件。
日誌輸出會顯示。服務應該在幾秒鐘內啓動並運行。

測試服務

如今服務已經開通,請訪問http://localhost:8080/greeting,在那裏你應該能夠看到。

{"id":1, "content": "你好,世界!"}

經過訪問http://localhost:8080/greeting?name=User,提供名稱查詢字符串參數。請注意content屬性的值是如何從Hello,World!變爲Hello,User!的,以下列表所示。

{"id":2, "content": "Hello, User!"}

這個變化代表GreetingController中的@RequestParam安排按照預期工做。名稱參數的默認值是World,但能夠經過查詢字符串明確地重寫。

還請注意id屬性如何從1變成了2,這證實你在多個請求中針對同一個GreetingController實例工做,而且每次調用時,它的計數器字段都按預期遞增。

總結

恭喜你!你剛剛用Spring開發了一個RESTful Web服務。你剛剛用Spring開發了一個RESTful web服務。

相關文章
相關標籤/搜索