構建入門Restful Web服務

建立資源類

假設你已經設置了項目和構建系統,你能夠建立Web服務。java

經過考慮服務交互來開始這個過程。git

該服務將處理GET請求/greeting,可選地使用name查詢字符串中的參數。該GET請求應該返回200 OK在表示問候的身體與JSON響應。它應該看起來像這樣:github

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

該id字段是問候語的惟一標識符,是問候語content的文本表示。web

要爲問候語表示建模,請建立資源表示形式類。提供一個普通的舊java對象,其中包含id和content數據的字段,構造函數和訪問器:spring

@Data
@AllArgsConstructor
public class Greeting {

    private final long id;
    private final String content;

}
正如你在下面的步驟中看到的,Spring使用Jackson JSON庫自動將類型實例Greeting封送到JSON中。

建立資源控制器

在Spring構建RESTful Web服務的方法中,HTTP請求由控制器處理。這些組件很容易經過@RestController註釋來識別,GreetingController下面經過返回類的新實例來處理GET請求:服務器

@RestController
public class GreetingController {

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

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

}

這個控制器簡潔而簡單,但引擎下有不少東西,讓咱們一步一步地分解它。restful

所述@RequestMapping註釋能夠確保HTTP請求/greeting被映射到greeting()方法。mvc

上面的示例未指定GETvs. PUT,POST等等,由於@RequestMapping默認狀況下映射全部HTTP操做。使用@RequestMapping(method=GET)縮小這種映射。

@RequestParam將查詢字符串參數的值綁定name到方法的name參數中greeting()。若是name請求中不存在該參數,defaultValue則使用「World」。app

方法體的實現基於來自的下一個值建立並返回Greeting具備id和content屬性的新對象,並使用問候counter格式化給定name的格式template。函數

傳統MVC控制器和上面的RESTful Web服務控制器之間的關鍵區別在於建立HTTP響應主體的方式。這個RESTful Web服務控制器只是填充並返回一個對象,而不是依靠視圖技術來執行將問候數據的服務器端呈現爲HTML Greeting。對象數據將做爲JSON直接寫入HTTP響應。

此代碼使用Spring 4的新@RestController註釋,它將類標記爲控制器,其中每一個方法都返回一個域對象而不是視圖。它是速記@Controller和@ResponseBody拼湊在一塊兒的。

該Greeting對象必須轉換爲JSON。因爲Spring的HTTP消息轉換器支持,您無需手動執行此轉換。由於Jackson 2在類路徑上,因此MappingJackson2HttpMessageConverter會自動選擇Spring 來將Greeting實例轉換爲JSON。

使應用程序可執行

雖然能夠將此服務打包爲傳統的WAR文件以部署到外部應用程序服務器,但下面演示的更簡單的方法建立了一個獨立的應用程序。您將全部內容打包在一個可執行的JAR文件中,由一個好的舊Java main()方法驅動。在此過程當中,您使用Spring的支持將Tomcat servlet容器嵌入爲HTTP運行時,而不是部署到外部實例。

@SpringBootApplication
public class RestfulWebApplication {

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

@SpringBootApplication 是一個便利註釋,添加了如下全部內容:

  • @Configuration 標記該類做爲應用程序上下文的bean定義的源。
  • @EnableAutoConfiguration 告訴Spring Boot開始根據類路徑設置,其餘bean和各類屬性設置添加bean。
  • 一般你會添加@EnableWebMvc一個Spring MVC應用程序,但Spring Boot會在類路徑上看到spring-webmvc時自動添加它。這會將應用程序標記爲Web應用程序並激活關鍵行爲,例如設置a DispatcherServlet.
  • @ComponentScan告訴Spring在包中尋找其餘組件,配置和服務hello,容許它找到控制器。

該main()方法使用Spring Boot的SpringApplication.run()方法來啓動應用程序。您是否注意到沒有一行XML?也沒有web.xml文件。此Web應用程序是100%純Java,您無需處理配置任何管道或基礎結構。

構建可執行的JAR

您可使用Gradle或Maven從命令行運行該應用程序。或者,您能夠構建一個包含全部必需依賴項,類和資源的可執行JAR文件,並運行該文件。這使得在整個開發生命週期中,跨不一樣環境等將服務做爲應用程序發佈,版本和部署變得容易。

若是您使用的是Gradle,則可使用運行該應用程序./gradlew bootRun。或者您可使用構建JAR文件./gradlew build。而後你能夠運行JAR文件:

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

若是您使用的是Maven,則可使用該應用程序運行該應用程序./mvnw spring-boot:run。或者您可使用構建JAR文件./mvnw clean package。而後你能夠運行JAR文件:

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

測試服務

如今該服務已啓動,請訪問http:// localhost:8080 / greeting,其中顯示:

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

name使用http:// localhost:8080 / greeting?name = User提供查詢字符串參數。注意content屬性的值如何從「Hello,World!」改變。「你好,用戶!」:

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

此更改代表該@RequestParam安排GreetingController正在按預期工做。該name參數已被賦予默認值「World」,但始終能夠經過查詢字符串顯式覆蓋。

另請注意id屬性如何從更改1爲2。這證實您正在GreetingController跨多個請求針對同一實例工做,而且其counter字段在每次調用時按預期遞增。

結尾

恭喜!您剛剛使用Spring開發了RESTful Web服務。

GitHub:Restful-Web


圖片描述