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

使用ResponseEntity處理API返回問題

 更新時間:2024年07月10日 16:24:40   作者:半城風(fēng)花半城雨  
這篇文章主要介紹了使用ResponseEntity處理API返回問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

最近在做Google AMP mail的時候遇到了一個問題,在調(diào)用/unsub(退訂)接口的時候需要向google client返回特定的ResponseHeader。

但是項(xiàng)目使用的是Springboot 2.x,通常使用@RestController修飾API層,無法做到動態(tài)的返回特殊的Header。那么如何對一些特殊的API做一些特別的返回值封裝呢?

Spring framework中的ResponseEntity類很好的解決了此問題。

眾所周知,我們的HTTP/HTTPS的響應(yīng)由狀態(tài)碼、頭部信息以及響應(yīng)體內(nèi)容三大塊組成,響應(yīng)體內(nèi)容可以通過返回值進(jìn)行一系列封裝回傳出結(jié)果,而狀態(tài)碼與頭部信息需要特別設(shè)置。

ResponseEntity的使用

先上源碼,看看ResponseEntity到底如何使用的。

1. ResponseEntity的第一種使用方式

public class ResponseEntity<T> extends HttpEntity<T> {
    public ResponseEntity(HttpStatus status) {
	    this((Object)null, (MultiValueMap)null, (HttpStatus)status);
	}
	
   public ResponseEntity(@Nullable T body, HttpStatus status) {
        this(body, (MultiValueMap)null, (HttpStatus)status);
    }
	
   public ResponseEntity(MultiValueMap<String, String> headers, HttpStatus status) {
        this((Object)null, headers, (HttpStatus)status);
    }
	
   public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatus status) {
        super(body, headers);
        Assert.notNull(status, "HttpStatus must not be null");
        this.status = status;
    }

   private ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, Object status) {
        super(body, headers);
        Assert.notNull(status, "HttpStatus must not be null");
        this.status = status;
    }
}

可以看到這個類提供了五個構(gòu)造方法,返回的狀態(tài)碼是必傳的外,頭部信息以及響應(yīng)體內(nèi)容都是可選擇的。

當(dāng)我們需要使用的時候,直接new一個ResponseEntity對象作為API返回值即可,這就是它的第一種使用方式。

需要注意的是,在有headers作為參數(shù)的構(gòu)造方法中,需要傳入一個類型為MultiValueMap<String, String>的參數(shù)。

MultiValueMap繼承自Map這個抽象類,其中擁有一個叫做HttpHeaders的子類,我們可以當(dāng)它為一個key和value都為String類型的HashMap使用。

HttpHeaders里面保存了一些常用的Header的key值,例如"Accept-Charset"。當(dāng)然也可以自定義一些特殊的key。

HttpHeaders headers = new HttpHeaders();
headers.add("Access-Control-Expose-Headers", "AMP-Access-Control-Allow-Source-Origin");

return new ResponseEntity<>(resultBody, headers, HttpStatus.OK);

2. ResponseEntity的第二種使用方式

繼續(xù)看源碼,發(fā)現(xiàn)了好多返回值為ResponseEntity.BodyBuilder的方法有木有

    public static ResponseEntity.BodyBuilder status(HttpStatus status) {
        Assert.notNull(status, "HttpStatus must not be null");
        return new ResponseEntity.DefaultBuilder(status);
    }

    public static ResponseEntity.BodyBuilder status(int status) {
        return new ResponseEntity.DefaultBuilder(status);
    }
        public static ResponseEntity.BodyBuilder ok() {
        return status(HttpStatus.OK);
    }
    public static ResponseEntity.BodyBuilder created(URI location) {
        ResponseEntity.BodyBuilder builder = status(HttpStatus.CREATED);
        return (ResponseEntity.BodyBuilder)builder.location(location);
    }

    public static ResponseEntity.BodyBuilder accepted() {
        return status(HttpStatus.ACCEPTED);
    }

    public static ResponseEntity.HeadersBuilder<?> noContent() {
        return status(HttpStatus.NO_CONTENT);
    }

    public static ResponseEntity.BodyBuilder badRequest() {
        return status(HttpStatus.BAD_REQUEST);
    }

    public static ResponseEntity.HeadersBuilder<?> notFound() {
        return status(HttpStatus.NOT_FOUND);
    }

    public static ResponseEntity.BodyBuilder unprocessableEntity() {
        return status(HttpStatus.UNPROCESSABLE_ENTITY);
    }
    .........

事實(shí)證明,越是偉大的軟件工程師是越“懶惰”的,為了節(jié)約時間增加效率,我們可以用Builder的方式去生成ResponseEntity對象并返回:

Map<String, String> resultBody = new HashMap<>();
resultBody.put("name":"Lucas");
resultBody.put("school":"harvard university");
 return ResponseEntity.status(HttpStatus.OK)
        .body(resultBody);

與其他方式對比

  • @RestController注解修飾controller層。

@RestController = @Controller + @ResponseBody

@ResponseBody是將controller的方法返回的對象通過適當(dāng)?shù)霓D(zhuǎn)換器轉(zhuǎn)換為指定的格式之后,寫入到response對象的body區(qū),通常用來返回JSON數(shù)據(jù)或者是XML數(shù)據(jù)。

注意:在使用此注解之后不會再走視圖處理器(ModelAndView),而是直接將數(shù)據(jù)寫入到輸入流中,他的效果等同于通過response對象輸出指定格式的數(shù)據(jù)。

  • @ResponseStatus

這個注解主要用在自定義的Exception 上,或者直接用在controller層的API方法上也可,當(dāng)發(fā)生異常/方法執(zhí)行結(jié)束時,會返回相應(yīng)的Http狀態(tài)碼和msg。

@ResponseStatus(value=HttpStatus.FORBIDDEN,reason="不允許訪問")

注:

  • ResponseEntity的優(yōu)先級高于@ResponseBody。
  • 只有在返回值不為ResponseEntity的情況下才去檢查有沒有@ResponseBody注解;如果響應(yīng)類型是ResponseEntity則會忽略@ResponseBody注解。

總結(jié)

ResponseEntity能夠非常方便的修改返回值的狀態(tài)碼,但最優(yōu)秀的用法仍然是能夠?yàn)椴煌珹PI設(shè)置不同的返回響應(yīng)頭。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot根據(jù)Word模板導(dǎo)出復(fù)雜格式的文檔

    SpringBoot根據(jù)Word模板導(dǎo)出復(fù)雜格式的文檔

    這篇文章主要為大家詳細(xì)介紹了Spring Boot 中根據(jù) Word 模板導(dǎo)出包含表格、圖表等復(fù)雜格式的文檔的相關(guān)實(shí)現(xiàn)方法,大家可以根據(jù)自己的需求進(jìn)行選擇
    2025-08-08
  • Mybatis分頁查詢主從表的實(shí)現(xiàn)示例

    Mybatis分頁查詢主從表的實(shí)現(xiàn)示例

    本文主要介紹了Mybatis分頁查詢主從表的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • Java實(shí)現(xiàn)上傳Excel文件并導(dǎo)入數(shù)據(jù)庫

    Java實(shí)現(xiàn)上傳Excel文件并導(dǎo)入數(shù)據(jù)庫

    這篇文章主要介紹了在java的基礎(chǔ)上學(xué)習(xí)上傳Excel文件并導(dǎo)出到數(shù)據(jù)庫,感興趣的小伙伴不要錯過奧
    2021-09-09
  • Java編程獲取文本框的內(nèi)容實(shí)例解析

    Java編程獲取文本框的內(nèi)容實(shí)例解析

    這篇文章主要介紹了Java編程獲取文本框的值實(shí)例解析,將輸入的值保存在一個指定的 txt文件之中,具有一定的參考價(jià)值,需要的朋友可以了解。
    2017-09-09
  • 基于java springboot + mybatis實(shí)現(xiàn)電影售票管理系統(tǒng)

    基于java springboot + mybatis實(shí)現(xiàn)電影售票管理系統(tǒng)

    這篇文章主要介紹了基于java springboot + mybatis實(shí)現(xiàn)的完整電影售票管理系統(tǒng)基于java springboot + mybatis,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Spring?MVC注解@ControllerAdvice的工作原理解讀

    Spring?MVC注解@ControllerAdvice的工作原理解讀

    本文解析SpringMVC中@ControllerAdvice注解,通過結(jié)合@ExceptionHandler、@ModelAttribute、@InitBinder實(shí)現(xiàn)全局異常處理、數(shù)據(jù)模型和綁定配置,解析其通過容器初始化和緩存機(jī)制提取并應(yīng)用定義的原理
    2025-08-08
  • 解析spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class

    解析spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class

    這篇文章主要介紹了spring事務(wù)管理@Transactional為什么要添加rollbackFor=Exception.class,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • springboot集成mybatisplus的方法

    springboot集成mybatisplus的方法

    這篇文章主要為大家詳細(xì)介紹了springboot集成mybatisplus的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 合并有序數(shù)組的實(shí)現(xiàn)(java與C語言)

    合并有序數(shù)組的實(shí)現(xiàn)(java與C語言)

    這篇文章主要介紹了合并有序數(shù)組的實(shí)現(xiàn)(java與C語言)的相關(guān)資料,這里對有序數(shù)組的合并分享了java版本和C語言版本的示例,需要的朋友可以參考下
    2017-08-08
  • Java 中的 getDeclaredMethods() 方法(使用與原理)

    Java 中的 getDeclaredMethods() 方法(使用與原理)

    文章介紹了Java反射機(jī)制中的`getDeclaredMethods()`方法,詳細(xì)講解了其使用方法、原理、注意事項(xiàng)以及實(shí)際應(yīng)用場景,幫助讀者更好地理解和應(yīng)用這一強(qiáng)大的工具,感興趣的朋友一起看看吧
    2024-12-12

最新評論

嘉义市| 东平县| 娱乐| 错那县| 松溪县| 宁夏| 卢湾区| 临湘市| 高平市| 黑河市| 万州区| 织金县| 普格县| 乌苏市| 永宁县| 甘泉县| 丰都县| 满洲里市| 蓝田县| 晋州市| 泰宁县| 平定县| 墨江| 西安市| 榆中县| 牙克石市| 茶陵县| 怀柔区| 安阳县| 英吉沙县| 藁城市| 日土县| 富阳市| 德钦县| 朝阳县| 丹棱县| 南开区| 平和县| 郧西县| 柘荣县| 子长县|