SpringBoot構(gòu)建Restful service完成Get和Post請求
一個基本的RESTfule service最進(jìn)場向外提供的請求Method就是Get和Post。
在Get中,常用的都會在請求上帶上參數(shù),或者是路徑參數(shù)。響應(yīng)Json。
在Post中,常用的會提交form data或者json data作為參數(shù),響應(yīng)Json。
1. Get請求,url傳參,返回json。
先準(zhǔn)備一個請求后,響應(yīng)的對象。
package com.example.demo;
public class Echo {
private final long id;
private final String content;
public Echo(long id, String content) {
this.id = id;
this.content = content;
}
public long getId() {
return this.id;
}
public String getContent() {
return this.content;
}
}
準(zhǔn)備一個用來接收請求的EchoController(名字可以根據(jù)實(shí)際情況寫),為它增加@RestController注解,表示這是一個處理RESTful請求的響處理類。
增加@RequestMapping,為本Controller提供一個根url,當(dāng)然可以不寫,寫這個是為了更好的將同一種處理的url歸在一類,本Controller其他的處理方法對應(yīng)的url中就不需要重復(fù)寫。
package com.example.demo;
import java.util.concurrent.atomic.AtomicLong;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ModelAttribute;
@RestController
@RequestMapping("/echo")
public class EchoController {
private static final String echoTemplate1 = "received %s!";
private static final String echoTemplate2 = "%s speak to %s \'%s\'";
private final AtomicLong counter = new AtomicLong();
@RequestMapping(value="/getter/pattern1", method=RequestMethod.GET)
public Echo getterPattern1(String content) {
return new Echo(counter.incrementAndGet(), String.format(echoTemplate1, content));
}
@RequestMapping(value="/getter/pattern2", method=RequestMethod.GET)
public Echo getterPattern2(@RequestParam(value="content", required=false) String alias) {
return new Echo(counter.incrementAndGet(), String.format(echoTemplate1, alias));
}
}
getterPattern1的上面增加了@RequestMapping注解,將指定的url和處理的方法進(jìn)行映射,對應(yīng)這個url的請求就由該方法來處理,method可以省略,省略后就是對應(yīng)所有的Http Metho,gtterPatten1方法的參數(shù)默認(rèn)就和url中的content參數(shù)進(jìn)行映射。
再看getterPattern2,跟上面的方法效果一致,他們的區(qū)別就在于參數(shù)定義用了@RequestParam注解將url參數(shù)和方法參數(shù)進(jìn)行了映射說明,@RequesteParam中value的值就是url中實(shí)際的參數(shù),required說明該參數(shù)是否必須,如果是true,而實(shí)際上url中并沒有帶上該參數(shù),那么會報異常,為防止異??梢栽黾觗efaultValue指定參數(shù)的默認(rèn)值即可。我們會發(fā)現(xiàn)這里的方法參數(shù)是alias,這里當(dāng)然是可以和url的參數(shù)名不同,只要RequestParam注解映射了他們的關(guān)系就沒問題。
運(yùn)行后,可以在瀏覽器中訪問對應(yīng)的url來看看結(jié)果,我這里是用curl來訪問。
curl http://localhost:8080/echo/getter/pattern1?content=hello
curl http://localhost:8080/echo/getter/pattern2?content=hello
上面兩個url的訪問得到的結(jié)果除了id會自增外,其他是一致的:
{"id":6,"content":"received hello!"}
2. Get請求,傳遞url路徑參數(shù),返回json。
在EchoController中增加一個響應(yīng)方法。
@RequestMapping(value="/getter/pattern3/{content}", method=RequestMethod.GET)
public Echo getterPattern3(@PathVariable String content) {
return new Echo(counter.incrementAndGet(), String.format(echoTemplate1, content));
}
可以看到,在@RequestMapping的url定義中的末尾有“{content}”,表明這里是一個路徑參數(shù),在getterPattern3的參數(shù)content增加了@PathVariable注解,將方法參數(shù)與路徑參數(shù)進(jìn)行了映射。
運(yùn)行后,訪問url。
curl http://localhost:8080/echo/getter/pattern3/123456
結(jié)果:
{"id":8,"content":"received 123456!"}
3.Post請求,參數(shù)以Http body的途徑提交Json數(shù)據(jù)。
先定義一個提交的Json對應(yīng)的對象,這里把它定義為Message。
package com.example.demo;
public class Message {
private String from;
private String to;
private String content;
public Message() {}
public String getFrom() {
return this.from;
}
public String getTo() {
return this.to;
}
public String getContent() {
return this.content;
}
public void setFrom(String value) {
this.from = value;
}
public void setTo(String value) {
this.to = value;
}
public void setContent(String value) {
this.content = value;
}
}
在EchoController增加響應(yīng)的方法,并完成映射。
@RequestMapping(value="/setter/message1", method=RequestMethod.POST)
public Echo setterMessage1(@RequestBody Message message) {
return new Echo(counter.incrementAndGet(), String.format(echoTemplate2, message.getFrom(), message.getTo(), message.getContent()));
}
在setterMessage1方法的參數(shù)中用@RequestBody將請求的Http Body和參數(shù)messge進(jìn)行了映射。
運(yùn)行后,使用curl向服務(wù)端提交json數(shù)據(jù)。提交的請求頭部要帶上"Content-Type:application/json",表明請求體Json。
curl -i -H "Content-Type:application/json" -d "{\"from\":\"Tom\",\"to\":\"Sandy\",\"content\":\"hello buddy\"}" http://localhost:8080/echo/setter/message1
結(jié)果:
{"id":9,"content":"Tom speak to Sandy 'hello buddy'"}
4.Post請求,參數(shù)以Http body的途徑提交表單數(shù)據(jù)。
在EchoController增加響應(yīng)的方法,并完成映射。
@RequestMapping(value="/setter/message2", method=RequestMethod.POST)
public Echo setterMessage2(@ModelAttribute Message message) {
return new Echo(counter.incrementAndGet(), String.format(echoTemplate2, message.getFrom(), message.getTo(), message.getContent()));
}
在setterMessage2方法的參數(shù)中用@ModelAttribute將請求的Http Body中的表單數(shù)據(jù)和參數(shù)messge進(jìn)行了映射。
運(yùn)行后,使用curl向服務(wù)端提交表單數(shù)據(jù)。提交的請求頭部要帶上"Content-Type:application/x-www-form-urlencoded",表明請求體是表單數(shù)據(jù),格式是"key1=value1&key2=value2&key3=value3"。
curl -i -H "Content-Type:application/x-www-form-urlencoded" -d "from=sandy&to=aissen&content=go to" http://localhost:8080/echo/setter/message2
結(jié)果:
{"id":11,"content":"sandy speak to aissen 'go to'"}
總結(jié)
以上所述是小編給大家介紹的SpringBoot構(gòu)建Restful service完成Get和Post請求,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
springboot+EHcache 實(shí)現(xiàn)文章瀏覽量的緩存和超時更新
這篇文章主要介紹了springboot+EHcache 實(shí)現(xiàn)文章瀏覽量的緩存和超時更新,問題描述和解決思路給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-04-04
如何利用Java實(shí)現(xiàn)MySQL的數(shù)據(jù)變化監(jiān)聽
在高并發(fā)和大數(shù)據(jù)環(huán)境下,實(shí)時獲取?MySQL?數(shù)據(jù)庫的增量變化對數(shù)據(jù)同步、數(shù)據(jù)分析、緩存更新等場景至關(guān)重要,下面我們就來看看如何通過Java實(shí)現(xiàn)MySQL的數(shù)據(jù)變化監(jiān)聽吧2025-02-02
Java爬蟲實(shí)戰(zhàn)抓取一個網(wǎng)站上的全部鏈接
這篇文章主要介紹了JAVA使用爬蟲抓取網(wǎng)站網(wǎng)頁內(nèi)容的方法,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧。2016-10-10
比較Java數(shù)組和各種List的性能小結(jié)
這篇文章主要是分別對Java數(shù)組、ArrayList、LinkedList和Vector進(jìn)行隨機(jī)訪問和迭代等操作,并比較這種集合的性能。有需要的可以參考借鑒。2016-08-08
java8中parallelStream性能測試及結(jié)果分析
本篇文章給大家用代碼實(shí)例做了segmentfaultjava8中parallelStream性能測試,并對測試結(jié)果做了說明,需要的朋友學(xué)習(xí)下吧。2018-01-01

