国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring boot自定義http反饋狀態碼詳解

Spring boot自定義http反饋狀態碼詳解

2020-11-22 22:48小強哥 Java教程

這篇文章主要給大家介紹了Spring boot自定義http反饋狀態碼的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。

前言

最近在開發一些http server類型程序,通過spring boot構建一些web程序,這些web程序之間通過http進行數據訪問、共享,如下圖,

Spring boot自定義http反饋狀態碼詳解

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

?
1
2
3
4
{
 "status":1,
 "message":"xxxxxx"
}

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

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

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

在方法上使用方式,

?
1
2
3
4
5
@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,會出現下面結果,

?
1
2
3
4
5
6
7
{
 "timestamp": 1497850427325,
 "status": 500,
 "error": "Internal Server Error",
 "message": "server error",
 "path": "/user"
}

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

在類中使用方式,

?
1
2
3
4
@ResponseStatus(code=HttpStatus.INTERNAL_SERVER_ERROR,reason="111")
public class ServerException extends Exception {
 
}

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

?
1
2
3
4
5
6
7
@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下的一個接口,如下使用,

?
1
2
3
4
5
@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

不多說,直接上代碼,

?
1
2
3
4
5
6
@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查看返回結果,如下,

?
1
2
3
{
 "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() :

?
1
2
3
4
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:

?
1
2
3
4
5
6
7
8
@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:

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

自定義http反饋碼在設計優良的restful api中起到關鍵作用,http反饋碼是業內統一、共識的,建議在盡量不要通過解析json來獲得status判斷操作結果。

總結

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

原文鏈接:http://xiaoqiangge.com/aritcle/1497859085696.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲成人一区二区在线观看 | 日韩欧美一区二区在线视频 | 久久久久久亚洲一区二区三区蜜臀 | 久久综合久久综合久久 | 国产精品久久一区二区三区 | 91av精品 | 久久久精品| 日韩中文字幕在线视频 | 91亚洲精品一区 | 日韩精品一区二 | 欧美日韩三级 | 国产精品国产三级国产aⅴ原创 | 亚洲电影在线播放 | 久久伊人精品网 | 久久精国产 | 91在线综合 | 欧美视频一二三区 | 男女做爰猛烈叫床无遮挡 | 天天插狠狠插 | 日韩欧美综合 | t66y最新地址一地址二69 | 亚洲第一成人在线视频 | 操操网站 | 久久久久a | 操视频网站| 中文字幕国产一区 | 欧美日韩国产精品 | 亚洲 成人 av | 一本大道久久a久久精二百 在线a人片免费观看视频 | 久久久久久免费毛片精品 | av瑟瑟 | 91久久国产综合久久91精品网站 | 免费成人黄色网址 | 国产一区久久 | 精品中文字幕在线 | 日本中文字幕一区 | 91精品国产综合久久久久久 | 久久精品中文字幕 | 在线成年人电影 | 五月激情综合网 | 久久久中文字幕 |