一帐萎、目標(biāo) (Goal):
我們將要編寫一個(gè)接收HTTP GET 請(qǐng)求的后臺(tái)服務(wù),如下:
http://localhost:8080/greeting
以及返回一個(gè)JSON格式的“問候”:
{"id":1,"content":"Hello, World!"}
并且我們可以帶著一個(gè)參數(shù)(name)請(qǐng)求:
http://localhost:8080/greeting?name=Boy
然后我們將得到 "Hello, Boy!"的“問候”:
{"id":1,"content":"Hello, User!"}
以上就是我們本次所要做的全部?jī)?nèi)容弥锄,Let's start it!
二蟆沫、工具
- IDE:我使用的是Intellij IDEA 2016.1.3籽暇;Eclipse也很不錯(cuò);
- JDK 1.8 及以后
- Maven 3.0+ (或者Gradle 2.3)饭庞;
- 也可以從 https://start.spring.io/ 直接自定義一個(gè)spring-boot工程文件并下載使用戒悠;注意Dependencies處需要添加Web依賴,其他等以后用到可以另作添加但绕;
三救崔、Coding
先看一下我們需要返回的數(shù)據(jù)格式(JSON):
{
"id": 1,
"content": "Hello, World!"
}
那么為了與之對(duì)應(yīng)惶看,我們就先編寫一個(gè)Greeting類:
路徑:src/main/java/com/fd/restService/model/Greeting.java
package com.fd.restService.model;
public class Greeting {
private final long id;
private final String content;
public Greeting(long id, String content) {
this.id = id;
this.content = content;
}
public long getId() {
return id;
}
public String getContent() {
return content;
}
}
Spring可以通過 Jackson JSON 庫(kù)捏顺,自動(dòng)地將Greeting實(shí)例轉(zhuǎn)化為上述JSON形式六孵。
接下來創(chuàng)建一個(gè)控制器(Controller):
在Spring應(yīng)用中,HTTP請(qǐng)求將由控制器(Controller)接收幅骄,并進(jìn)行相應(yīng)處理劫窒。@RestController將GreetingController類標(biāo)注為一個(gè)控制器。
路徑:src/main/java/com/fd/restService/controller/GreetingController.java
package com.fd.restService.controller;
import com.fd.demo.model.Greeting;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.atomic.AtomicLong;
@RestController //標(biāo)注為控制器
public class GreetingController {
private static final String template = "Hello, %s!"; //返回格式
private final AtomicLong counter = new AtomicLong(); //線程安全的Long
@RequestMapping("/greeting") //設(shè)置訪問路徑
//設(shè)置一個(gè)請(qǐng)求參數(shù)name拆座,不傳則默認(rèn)傳“World”字符串
public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) {
//簡(jiǎn)單的返回一個(gè)Greeting實(shí)例主巍,而Spring會(huì)將其轉(zhuǎn)化為JSON格式
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}
}
注意幾個(gè)注解的用法:
- @RestController:包含了@Controller和@ResponseBody;
- @RequestMapping:value屬性表示訪問路徑設(shè)置挪凑,method屬性設(shè)置HTTP方法(如GET孕索、POST、PUT等)躏碳;
如:@RequestMapping(value = "/greeting",method = RequestMethod.GET)
- @RequestParam:常用有value搞旭、defaultValue、required屬性等
注:與傳統(tǒng)的MVC(通常返回一個(gè)HTML視圖)不同菇绵,RESTful風(fēng)格的Web服務(wù)注重?cái)?shù)據(jù)的交互肄渗,所以在返回的HTTP消息體中只有簡(jiǎn)單的數(shù)據(jù)本地(JSON格式簡(jiǎn)潔且易理解),這樣也便利了前后端的分離咬最。
運(yùn)行前的工作:
在通常的工作中翎嫡,我們都是通過打包成war包然后部署到遠(yuǎn)程服務(wù)器上的這么一個(gè)步驟。而spring有一套更簡(jiǎn)便運(yùn)行web服務(wù)的策略:
將所有需要運(yùn)行的類都各自打包成一個(gè)獨(dú)立的jar包永乌,并設(shè)置一個(gè)main()函數(shù)作為程序入口惑申。然后就可以通過spring的內(nèi)置Tomcat容器部署運(yùn)行你的服務(wù)。
以上都是策略翅雏,不需要我們實(shí)際依次去操作硝桩。
我們只要提供一個(gè)程序入口類:
路徑:src/main/java/com/fd/restService/ResTfulServiceApplication.java
package com.fd.restService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ResTfulServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ResTfulServiceApplication.class, args);
}
}
- @SpringBootApplication注解是以下幾個(gè)注解的總和:
1.@Configuration:它告知 Spring 容器這個(gè)類是一個(gè)擁有 bean 定義和依賴項(xiàng)的配置類;
2.@EnableAutoConfiguration:暗地里定義了一個(gè)基礎(chǔ)的包路徑枚荣,Spring Boot會(huì)在該包路徑來搜索類碗脊;
3.@EnableWebMvc
4.@ComponentScan:讓Spring去尋找包內(nèi)其他的組件、配置以及服務(wù)橄妆,在這里也就是找到我們的GreetingController 類衙伶;
最后,打jar包運(yùn)行或者依賴IDE運(yùn)行后:
運(yùn)行成功后在瀏覽器中輸入:
http://localhost:8080/greeting
得到返回結(jié)果:
{"id":1,"content":"Hello, World!"}