最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring boot自定義http反饋狀態(tài)碼詳解

 更新時(shí)間:2017年06月21日 11:20:36   作者:小強(qiáng)哥  
這篇文章主要給大家介紹了Spring boot自定義http反饋狀態(tài)碼的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。

前言

最近在開(kāi)發(fā)一些http server類型程序,通過(guò)spring boot構(gòu)建一些web程序,這些web程序之間通過(guò)http進(jìn)行數(shù)據(jù)訪問(wèn)、共享,如下圖,

假設(shè)現(xiàn)在client發(fā)起一次保存數(shù)據(jù)的請(qǐng)求到server,server可能會(huì)返回如下類似的數(shù)據(jù)

{
 "status":1,
 "message":"xxxxxx"
}

然后client通過(guò)解析json獲得status來(lái)判斷當(dāng)前的請(qǐng)求操作是否成功,開(kāi)發(fā)過(guò)程中通過(guò)都是這么做的,但是這樣在restful設(shè)計(jì)中不怎么好,其實(shí)這個(gè)status字段的表達(dá)完全可以通過(guò)http status來(lái)表示,類似404、500、502這種都有明確的定義并且相互理解、溝通起來(lái)也方便。

文章主要記錄一下我是如何在spring boot中實(shí)現(xiàn)自定反饋狀態(tài)碼的,以及我找到的三種實(shí)現(xiàn)方式。

第一種,使用**@ResponseStatus** 。這是一個(gè)注解,可以作用在方法和類上面,如下使用,

在方法上使用方式,

@RequestMapping(value = "/user", method = RequestMethod.GET)
 @ResponseStatus(code=HttpStatus.INTERNAL_SERVER_ERROR,reason="server error")
 public String getUser(){
 return "im zhangsan";
 }

啟動(dòng)web程序,通過(guò)postman訪問(wèn)http://127.0.0.1:8100/user,會(huì)出現(xiàn)下面結(jié)果,

{
 "timestamp": 1497850427325,
 "status": 500,
 "error": "Internal Server Error",
 "message": "server error",
 "path": "/user"
}

這里我一開(kāi)始覺(jué)得很奇怪,為什么我的getUser方法中沒(méi)有錯(cuò)誤,結(jié)果還是出現(xiàn)了500錯(cuò)誤?原因就是@ResponseStatus注解的問(wèn)題,我后面猜測(cè)它會(huì)強(qiáng)制的將映射轉(zhuǎn)化成500的狀態(tài)碼。這種應(yīng)用場(chǎng)景我想不太明白在什么地方會(huì)用到。

在類中使用方式,

@ResponseStatus(code=HttpStatus.INTERNAL_SERVER_ERROR,reason="111")
public class ServerException extends Exception {

}

這種使用方式就是將自定義異常和狀態(tài)碼結(jié)合在一起,合理使用自定義異常機(jī)制可以最大化的提高程序的健壯性,下面看如何使用,

@RequestMapping(value = "/user", method = RequestMethod.GET)
public String getUser(@RequestParam String userName) throws ServerException{
 if(StringUtils.isEmpty(userName)){
 throw new ServerException();
 }
 return "im zhangsan";
}

這段代碼的意思是當(dāng)userName字段為null的時(shí)候會(huì)拋出ServerException異常,但是ServerException類被標(biāo)記了@ResponseStatus注解,因此會(huì)直接報(bào)500錯(cuò)誤,如果覺(jué)得500不適合還可以定義其它的錯(cuò)誤代碼。

這種方式看著已經(jīng)很好了,可以按照邏輯自定義反饋碼,程序夠健壯。這種方式也有不好地方,如果反饋碼太多需要定義太多的異常類,并且錯(cuò)誤內(nèi)容reason還是不能手動(dòng)定義。

到這里,我基本上放棄了@ResponseStatus的使用了。

第二種,使用HttpServletResponse,HttpServletResponse是javax.servlet下的一個(gè)接口,如下使用,

@RequestMapping(value = "/user", method = RequestMethod.GET)
public void getUser(HttpServletResponse response) throws IOException{
 response.setStatus(500);
 response.getWriter().append("server error");
}

這種方式可以很好的實(shí)現(xiàn)同時(shí)滿足自定義反饋碼+消息內(nèi)容,一般的實(shí)現(xiàn)方式也都是這樣。但是這樣也不是太好,

  1. 在括號(hào)內(nèi)創(chuàng)建了一個(gè)response內(nèi)置變量,這樣顯得不夠美觀,反而有些多余。
  2. 在方法中調(diào)用了源生的方法來(lái)設(shè)置反饋碼和消息體,并且如果需要返回json格式數(shù)據(jù)還需要設(shè)置response.setContentType("application/json");response.setCharacterEncoding("UTF-8"); ,這樣做有些多余,重復(fù)的工作太多,雖然可以進(jìn)行封裝。
  3. 最嚴(yán)重的問(wèn)題這個(gè)方法必須是void類型,否則就會(huì)和@ResponseBody出現(xiàn)沖突,其次就是不能利用@ResponseBody自動(dòng)封裝json的特性,在spring mvc框架中如果在方法上加上@ResponseBody是可以對(duì)返回值自動(dòng)進(jìn)行json封裝的。

再找找其他的,如果沒(méi)有找到,估計(jì)也只能接受這個(gè)不完美的東西了。

后來(lái)在翻閱spring boot文檔的時(shí)候找到了ResponseEntity這么一個(gè)東西,這就是我要說(shuō)的第三種方式。

第三種,使用ResponseEntity

不多說(shuō),直接上代碼,

@RequestMapping(value = "/user", method = RequestMethod.GET)
public ResponseEntity<Map<String,Object>> getUser() throws IOException{
 Map<String,Object> map = new HashMap<String,Object>();
 map.put("name", "zhangsan");
 return new ResponseEntity<Map<String,Object>>(map,HttpStatus.OK);
}

通過(guò)postman查看返回結(jié)果,如下,

{
 "name": "zhangsan"
}

可以直接將map對(duì)象幫我轉(zhuǎn)化成json對(duì)象,并且可以獲得自定義狀態(tài)碼,很好,很強(qiáng)大。

這種方式很和我意,

  1. 不需要多于的HttpServletResponse,看著很干凈。
  2. 可以充分利用@ResponseBody注解,直接將我的返回值幫我轉(zhuǎn)化成json對(duì)象。
  3. 在設(shè)置返回值的時(shí)候同時(shí)還可以設(shè)置http反饋碼,HttpStatus是springframework提供的一個(gè)枚舉類,里面封裝了所有的http反饋碼,方便使用命名統(tǒng)一,不會(huì)有任何歧義。

相比于前面兩種,這種方式很對(duì)我胃口。

仔細(xì)看了ResponseEntity的說(shuō)明,發(fā)現(xiàn)spring mvc其它很多地方也都有使用,如下,下面內(nèi)容摘自org.springframework.http.ResponseEntity文件注釋,

In RestTemplate, this class is returned by getForEntity() and exchange() :

ResponseEntity<String> entity = template.getForEntity("http://example.com", String.class);
 String body = entity.getBody();
 MediaType contentType = entity.getHeaders().getContentType();
 HttpStatus statusCode = entity.getStatusCode();

Can also be used in Spring MVC, as the return value from a @Controller method:

@RequestMapping("/handle")
 public ResponseEntity<String> handle() {
 URI location = ...;
 HttpHeaders responseHeaders = new HttpHeaders();
 responseHeaders.setLocation(location);
 responseHeaders.set("MyResponseHeader", "MyValue");
 return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
 }

這就是上面說(shuō)過(guò)的。

Or, by using a builder accessible via static methods:

@RequestMapping("/handle")
 public ResponseEntity<String> handle() {
 URI location = ...;
 return ResponseEntity.created(location).header("MyResponseHeader", "MyValue").body("Hello World");
 }

自定義http反饋碼在設(shè)計(jì)優(yōu)良的restful api中起到關(guān)鍵作用,http反饋碼是業(yè)內(nèi)統(tǒng)一、共識(shí)的,建議在盡量不要通過(guò)解析json來(lái)獲得status判斷操作結(jié)果。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)給各位iOS開(kāi)發(fā)者們能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Java設(shè)計(jì)模式之橋接模式詳解

    Java設(shè)計(jì)模式之橋接模式詳解

    橋接模式(Bridge Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,用于將抽象部分和實(shí)現(xiàn)部分`分離開(kāi)來(lái),從而使它們可以獨(dú)立地進(jìn)行變化,本節(jié)給大家講一下設(shè)計(jì)模式中的橋接模式,并結(jié)合實(shí)際業(yè)務(wù)場(chǎng)景給大家講解如何使用,需要的朋友可以參考下
    2023-07-07
  • 詳解如何保證Java本地緩存的一致性

    詳解如何保證Java本地緩存的一致性

    所謂的一致性是指在同時(shí)使用緩存和數(shù)據(jù)庫(kù)的場(chǎng)景下,要確保數(shù)據(jù)在緩存與數(shù)據(jù)庫(kù)中的更新操作保持同步,那么,怎么保證Java本地緩存的一致性?所以本文將給大家介紹了如何保證Java本地緩存的一致性,需要的朋友可以參考下
    2024-01-01
  • 微服務(wù)?Spring?Boot?整合?Redis?BitMap?實(shí)現(xiàn)?簽到與統(tǒng)計(jì)功能

    微服務(wù)?Spring?Boot?整合?Redis?BitMap?實(shí)現(xiàn)?簽到與統(tǒng)計(jì)功能

    這篇文章主要介紹了微服務(wù)?Spring?Boot?整合?Redis?BitMap?實(shí)現(xiàn)?簽到與統(tǒng)計(jì)功能,文章簡(jiǎn)單介紹了Redis BitMap 基本用法結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Idea 配置國(guó)內(nèi) Maven 源的圖文教程

    Idea 配置國(guó)內(nèi) Maven 源的圖文教程

    這篇文章主要介紹了Idea 配置國(guó)內(nèi) Maven 源的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例

    Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例

    這篇文章主要給大家介紹了利用Java生成動(dòng)態(tài)版驗(yàn)證碼的方法實(shí)例,本文生成的是GIF格式 + 干擾元素,讓驗(yàn)證碼破解難度又上了一個(gè)層次,文中給出了詳細(xì)的示例代碼,并在文末給出了完整的實(shí)例代碼供大家下載學(xué)習(xí),需要的朋友們下面來(lái)一起看看吧。
    2017-04-04
  • java Class文件內(nèi)部結(jié)構(gòu)解析過(guò)程詳解

    java Class文件內(nèi)部結(jié)構(gòu)解析過(guò)程詳解

    java class的文件結(jié)構(gòu),java class文件結(jié)構(gòu)是基于字節(jié)流的,用unicode進(jìn)行編碼,下面說(shuō)說(shuō)java Class文件內(nèi)部結(jié)構(gòu)分析
    2013-11-11
  • SpringBoot中Session的使用及說(shuō)明

    SpringBoot中Session的使用及說(shuō)明

    這篇文章主要介紹了SpringBoot中Session的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java中的HashMap內(nèi)存泄漏問(wèn)題詳解

    Java中的HashMap內(nèi)存泄漏問(wèn)題詳解

    這篇文章主要介紹了Java中的HashMap內(nèi)存泄漏問(wèn)題詳解,WeakHashMap中的key是弱引用,如果再使用之后沒(méi)有及時(shí)remove掉這個(gè)key,那么當(dāng)GC時(shí)key就可能會(huì)被回收,導(dǎo)致key對(duì)應(yīng)的value對(duì)象占用的內(nèi)存無(wú)法回收進(jìn)而導(dǎo)致內(nèi)存泄漏,需要的朋友可以參考下
    2023-09-09
  • 詳解Java實(shí)現(xiàn)緩存(LRU,FIFO)

    詳解Java實(shí)現(xiàn)緩存(LRU,FIFO)

    本篇文章主要介紹了詳解Java實(shí)現(xiàn)緩存(LRU,FIFO) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式

    Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式

    這篇文章主要為大家詳細(xì)介紹了Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03

最新評(píng)論

邯郸市| 永寿县| 赞皇县| 东平县| 巧家县| 华阴市| 镇远县| 宁海县| 页游| 饶阳县| 西乌| 辰溪县| 长治市| 富宁县| 定结县| 三门峡市| 余姚市| 博白县| 汾西县| 通辽市| 大冶市| 平江县| 姚安县| 兴仁县| 海丰县| 民权县| 乐昌市| 枣阳市| 松滋市| 许昌县| 修武县| 根河市| 青铜峡市| 孝义市| 昭通市| 甘德县| 武陟县| 天镇县| 贵州省| 阳泉市| 利川市|