91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Spring boot怎么自定義http的反饋狀態碼

發布時間:2020-11-24 16:40:46 來源:億速云 閱讀:187 作者:Leah 欄目:編程語言

使用Spring boot怎么自定義http的反饋狀態碼?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

通過spring boot構建一些web程序,這些web程序之間通過http進行數據訪問、共享,如下圖,

使用Spring boot怎么自定義http的反饋狀態碼

假設現在client發起一次保存數據的請求到server,server可能會返回如下類似的數據

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

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

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

第一種,使用**@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,會出現下面結果,

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

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

在類中使用方式,

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

}

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

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

這段代碼的意思是當userName字段為null的時候會拋出ServerException異常,但是ServerException類被標記了@ResponseStatus注解,因此會直接報500錯誤,如果覺得500不適合還可以定義其它的錯誤代碼。

這種方式看著已經很好了,可以按照邏輯自定義反饋碼,程序夠健壯。這種方式也有不好地方,如果反饋碼太多需要定義太多的異常類,并且錯誤內容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");
}

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

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

{
 "name": "zhangsan"
}

可以直接將map對象幫我轉化成json對象,并且可以獲得自定義狀態碼,很好,很強大。

這種方式很和我意,

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

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

仔細看了ResponseEntity的說明,發現spring mvc其它很多地方也都有使用,如下,下面內容摘自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反饋碼在設計優良的restful api中起到關鍵作用,http反饋碼是業內統一、共識的,建議在盡量不要通過解析json來獲得status判斷操作結果。

關于使用Spring boot怎么自定義http的反饋狀態碼問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巩留县| 临猗县| 嵊州市| 东莞市| 乌拉特后旗| 龙口市| 长宁区| 汽车| 南雄市| 永修县| 大同市| 宜川县| 龙江县| 名山县| 黔东| 修水县| 宣武区| 双城市| 新邵县| 保靖县| 大理市| 宣威市| 新平| 清原| 黄龙县| 新兴县| 遂昌县| 溧水县| 武山县| 特克斯县| 西安市| 堆龙德庆县| 手游| 彝良县| 连云港市| 辽源市| 富蕴县| 淮阳县| 太和县| 九龙坡区| 肇东市|