欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

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

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

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

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

在方法上使用方式,

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

啟動web程序,通過postman訪問http://127.0.0.1:8100/user,會出現(xiàn)下面結(jié)果,

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

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

在類中使用方式,

@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的時候會拋出ServerException異常,但是ServerException類被標(biāo)記了@ResponseStatus注解,因此會直接報500錯誤,如果覺得500不適合還可以定義其它的錯誤代碼。

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

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

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

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

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

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

再找找其他的,如果沒有找到,估計也只能接受這個不完美的東西了。

后來在翻閱spring boot文檔的時候找到了ResponseEntity這么一個東西,這就是我要說的第三種方式。

第三種,使用ResponseEntity

不多說,直接上代碼,

@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);
}

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

{
 "name": "zhangsan"
}

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

這種方式很和我意,

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

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

仔細(xì)看了ResponseEntity的說明,發(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);
 }

這就是上面說過的。

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è)計優(yōu)良的restful api中起到關(guān)鍵作用,http反饋碼是業(yè)內(nèi)統(tǒng)一、共識的,建議在盡量不要通過解析json來獲得status判斷操作結(jié)果。

總結(jié)

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

相關(guān)文章

  • Redis有效時間設(shè)置以及時間過期處理操作

    Redis有效時間設(shè)置以及時間過期處理操作

    這篇文章主要介紹了Redis有效時間設(shè)置以及時間過期處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Java如何實現(xiàn)List自定義排序

    Java如何實現(xiàn)List自定義排序

    這篇文章主要介紹了Java如何實現(xiàn)List自定義排序,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • ShardingSphere-Proxy5搭建使用過程分析

    ShardingSphere-Proxy5搭建使用過程分析

    ShardingSphere-Proxy是跨語言的數(shù)據(jù)庫代理服務(wù)端,主要用來處理:分表、分庫、讀寫分離 等,這篇文章主要介紹了ShardingSphere-Proxy5搭建使用過程,需要的朋友可以參考下
    2022-10-10
  • Idea2020.2創(chuàng)建JavaWeb項目(部署Tomcat)方法詳解

    Idea2020.2創(chuàng)建JavaWeb項目(部署Tomcat)方法詳解

    這篇文章主要介紹了Idea2020.2創(chuàng)建JavaWeb項目(部署Tomcat)方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Spring Boot集成MyBatis實現(xiàn)通用Mapper的配置及使用

    Spring Boot集成MyBatis實現(xiàn)通用Mapper的配置及使用

    關(guān)于MyBatis,大部分人都很熟悉。MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。這篇文章主要介紹了Spring Boot集成MyBatis實現(xiàn)通用Mapper,需要的朋友可以參考下
    2018-08-08
  • Java實現(xiàn)文件上傳的方法

    Java實現(xiàn)文件上傳的方法

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)文件上傳的方法,供大家參考,感興趣的朋友可以參考一下
    2016-05-05
  • java實現(xiàn)讀取帶合并單元格的Excel

    java實現(xiàn)讀取帶合并單元格的Excel

    這篇文章主要為大家詳細(xì)介紹了java如何實現(xiàn)讀取帶合并單元格的Excel,文中的示例代碼講解詳細(xì), 感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • Java?map和bean互轉(zhuǎn)常用的方法總結(jié)

    Java?map和bean互轉(zhuǎn)常用的方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java中map和bean互轉(zhuǎn)常用方法的相關(guān)資料,平時日常Java開發(fā),經(jīng)常會涉及到Java?Bean和Map之間的類型轉(zhuǎn)換,需要的朋友可以參考下
    2023-09-09
  • springboot 使用yml配置文件自定義屬性的操作代碼

    springboot 使用yml配置文件自定義屬性的操作代碼

    在SpringBoot中yml/yaml文件可以自定義一些屬性,以供注入給自定義bean對象的屬性,主要通過空格和層次來實現(xiàn),類似于python代碼,本文通過實例代碼給大家介紹springboot 使用yml配置文件自定義屬性,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 詳解java中的synchronized關(guān)鍵字

    詳解java中的synchronized關(guān)鍵字

    這篇文章主要介紹了java中的synchronized關(guān)鍵字,可用來給對象和方法或者代碼塊加鎖,當(dāng)它鎖定一個方法或者一個代碼塊的時候,同一時刻最多只有一個線程執(zhí)行這段代碼,感興趣的小伙伴們可以參考一下
    2015-12-12

最新評論