色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Restful風格對接接口使用的規范

科技綠洲 ? 來源:猿小馬 ? 作者:猿小馬 ? 2023-10-16 10:16 ? 次閱讀

概要

本實例適合所有的開發,不僅僅是前后端分離項目,不分離項目使用的AJAX請求后臺也可以使用!

例如:

/**
	初學者都喜歡使用@RequestMapping注解直接在Controller的方法中進行映射
 */
	@RequestMapping("/queryById")
    public Demo queryById(Integer id) {
        ......
    }

大多數接口都包含新增、刪除、修改、分頁查詢、部分也查詢、按ID查詢等6個接口,這樣如果業務復雜的請求,一個Controller里面有過多的@RequestMapping映射,那里面映射的單詞都不一樣,那樣開發出來的代碼一眼看就是很糟糕?。?/p>

使用Restful風格只有在Controller類上有@RequestMapping注解,其中的方法只對應請求方式,比如分頁查詢的get請求直接使用 @GetMapping在方法上即可!如果有過多的get請求比如通過id查詢則使用地址傳參的方式 @GetMapping("{id}")然后在方法參數中加入@PathVariable("id") Integer id即可使用參數id!

@GetMapping("{id}")
    public Demo queryById(@PathVariable("id") Integer id) {
       ....
    }

以上只是對請求方式以及請求參數的一種寫法,這里還有就是返回參數的問題,在所有的接口請求中都會有著不同的返回,上面都是返回的一個Demo的實體對象,但是在業務操作中,比如再獲取列表的接口,那我們就需要返回的是一個集合,如果是修改的接口,那我們可能返回的是一個是否修改成功的標識,那樣一個Controller里面就很繁瑣了,如果遇到外鍵查詢可能不是一個實體的對象,則就需要單獨處理,所以我自己使用的就是一個封裝的一個返回對象JsonWrite

package com.ww.talk.util;

/**
 * @author maker
 * @desc 后臺返回前臺json格式
 */
public class JsonWrite {
    public JsonWrite() {
    }

    /**
     * 狀態碼
     */
    private String code;
    /**
     * 是否成功
     */
    private boolean success;


    /**
     * 提示消息
     */
    private String msg;
    /**
     * 返回的數據
     */
    private Object data;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public JsonWrite(String code, boolean success, String msg) {
        this.code = code;
        this.success = success;
        this.msg = msg;
    }


    public JsonWrite(String code, boolean success, String msg, Object data) {
        this.code = code;
        this.success = success;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 自定義返回內容
     *
     * @param code
     * @param success
     * @param msg
     * @param data
     * @return
     */
    public static JsonWrite CUSTOMIZE(String code, boolean success, String msg, Object data) {
        JsonWrite jsonWrite = new JsonWrite();
        jsonWrite.setCode(code);
        jsonWrite.setSuccess(success);
        jsonWrite.setMsg(msg);
        jsonWrite.setData(data);
        return jsonWrite;
    }

    /**
     * 自定義返回內容
     *
     * @param code
     * @param success
     * @param msg
     * @return
     */
    public static JsonWrite CUSTOMIZE(String code, boolean success, String msg) {
        JsonWrite jsonWrite = new JsonWrite();
        jsonWrite.setCode(code);
        jsonWrite.setSuccess(success);
        jsonWrite.setMsg(msg);
        return jsonWrite;
    }

    /**
     * 操作成功,無數據傳遞
     *
     * @return
     */
    public static JsonWrite SUCCESS() {
        JsonWrite jsonWrite = new JsonWrite();
        jsonWrite.setCode(StatusCode.SUCCESS.getCode());
        jsonWrite.setSuccess(true);
        jsonWrite.setMsg(StatusCode.SUCCESS.getMsg());
        return jsonWrite;
    }

    /**
     * 操作成功,傳遞數據
     *
     * @return
     */
    public static JsonWrite SUCCESS(Object data) {
        JsonWrite jsonWrite = new JsonWrite();
        jsonWrite.setCode(StatusCode.SUCCESS.getCode());
        jsonWrite.setSuccess(true);
        jsonWrite.setMsg(StatusCode.SUCCESS.getMsg());
        jsonWrite.setData(data);
        return jsonWrite;
    }

    /**
     * 操作失敗,無數據傳遞
     *
     * @return
     */
    public static JsonWrite ERROR() {
        JsonWrite jsonWrite = new JsonWrite();
        jsonWrite.setCode(StatusCode.SUCCESS.getCode());
        jsonWrite.setSuccess(false);
        jsonWrite.setMsg(StatusCode.SUCCESS.getMsg());
        return jsonWrite;
    }

    /**
     * 操作失敗,傳遞數據
     *
     * @param data
     * @return
     */
    public static JsonWrite ERROR(Object data) {
        JsonWrite jsonWrite = new JsonWrite();
        jsonWrite.setCode(StatusCode.SUCCESS.getCode());
        jsonWrite.setSuccess(false);
        jsonWrite.setMsg(StatusCode.SUCCESS.getMsg());
        jsonWrite.setData(data);
        return jsonWrite;
    }

    /**
     * 操作成功,自定義消息
     *
     * @param msg
     * @return
     */
    public static JsonWrite SUCCESS(String msg) {
        JsonWrite jsonWrite = new JsonWrite();
        jsonWrite.setCode(StatusCode.SUCCESS.getCode());
        jsonWrite.setSuccess(true);
        jsonWrite.setMsg(msg);
        return jsonWrite;
    }

    /**
     * 操作成功,傳遞數據及自定義消息
     *
     * @param msg
     * @param data
     * @return
     */
    public static JsonWrite SUCCESS(String msg, Object data) {
        JsonWrite jsonWrite = new JsonWrite();
        jsonWrite.setCode(StatusCode.SUCCESS.getCode());
        jsonWrite.setSuccess(true);
        jsonWrite.setMsg(msg);
        jsonWrite.setData(data);
        return jsonWrite;
    }

    /**
     * 操作失敗,自定義消息
     *
     * @param msg
     * @return
     */
    public static JsonWrite ERROR(String msg) {
        JsonWrite jsonWrite = new JsonWrite();
        jsonWrite.setCode(StatusCode.SUCCESS.getCode());
        jsonWrite.setSuccess(false);
        jsonWrite.setMsg(msg);
        return jsonWrite;
    }

    /**
     * 操作失敗,傳遞數據以及自定義消息
     *
     * @param msg
     * @param data
     * @return
     */
    public static JsonWrite ERROR(String msg, Object data) {
        JsonWrite jsonWrite = new JsonWrite();
        jsonWrite.setCode(StatusCode.SUCCESS.getCode());
        jsonWrite.setSuccess(false);
        jsonWrite.setMsg(msg);
        jsonWrite.setData(data);
        return jsonWrite;
    }

    /**
     * 系統錯誤
     */
    public static JsonWrite SYSTEMERROR(String msg, Object data){
        JsonWrite jsonWrite = new JsonWrite();
        jsonWrite.setCode(StatusCode.SERVERERROR.getCode());
        jsonWrite.setSuccess(false);
        jsonWrite.setMsg(msg);
        jsonWrite.setData(data);
        return jsonWrite;
    }
}

可以看到我們的返回實體JsonWrite有很多的構造方法,這樣可以滿足多種返回格式!比如之前上面的通過id請求的結果我們可以寫成:

/**
     * 通過主鍵查詢單條數據
     *
     * @param id 主鍵
     * @return 單條數據
     */
    @GetMapping("{id}")
    public JsonWrite queryById(@PathVariable("id") Integer id) {
        return JsonWrite.SUCCESS(this.userService.queryById(id));
    }

因為通過ID查詢一般不會出現查詢錯誤的情況,所以直接就是使用的SUCCESS的方法返回!

介紹

提示:上面的定義的JsonWrite類中也有其他的輔助類:StatusCode(返回狀態碼枚舉)

public enum StatusCode {
    /**
     * 狀態碼
     */
    SUCCESS("200", "OK"),
    BADREQUIRED("400", "Bad Request"),
    ACCESSERROR("401", "Access-Token Error"),
    AUTHERROR("403", "沒有權限"),
    NOTFOUND("404", "Not Found"),
    SERVERERROR("500", "Internal Server Error"),
    REPEAT("600", "Repeat request,Request Forbidden"),
    BADGATEWAY("502", "Bad Gateway"),
    SERVICEUNAVAILABLE("503", "Service Unavailable"),
    ACCOUNT_ERROR("1000", "賬戶不存在或被禁用"),
    API_NOT_EXISTS("1001", "請求的接口不存在"),
    API_NOT_PER("1002", "沒有該接口的訪問權限"),
    PARAMS_ERROR("1004", "參數錯誤或格式錯誤"),
    SIGN_ERROR("1005", "數據簽名錯誤"),
    API_DISABLE("1011", "查詢權限已被限制"),
    UNKNOWN_IP("1099", "非法IP請求");

    /**
     * 狀態碼
     */
    private String code;
    /**
     * 狀態描述
     */
    private String msg;

    public String getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    StatusCode(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

不同的返回狀態嗎對應著不同的含義!這樣前端人員調用接口之后看到了返回狀態碼就知道對應的是什么問題,只有狀態碼為200的時候才是正常的返回正確結果!這也是一種對于前后端的規范!

案例

提示:這里我們編寫了一個案例,大家可以對照案例理解一下思路!

package com.ww.talk.controller;

import com.ww.talk.util.JsonWrite;
import com.ww.talk.util.TableGrid;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * (User)表控制層
 *
 * @author makejava
 */
@RestController
@RequestMapping("user")
public class UserController {
    /**
     * 服務對象
     */
    @Resource
    private UserService userService;
    /**
     * 分頁查詢
     *
     * @param tableGrid  篩選條件
     * @return 查詢結果
     */
    @GetMapping
    public JsonWrite queryByPage(TableGrid tableGrid) {
        return JsonWrite.SUCCESS(this.userService.queryByPage(tableGrid));
    }

    /**
     * 通過主鍵查詢單條數據
     *
     * @param id 主鍵
     * @return 單條數據
     */
    @GetMapping("{id}")
    public JsonWrite queryById(@PathVariable("id") Integer id) {
        return JsonWrite.SUCCESS(this.userService.queryById(id));
    }

    /**
     * 新增數據
     *
     * @param user 實體
     * @return 新增結果
     */
    @PostMapping
    public JsonWrite add(@RequestBody User user) {
        return this.userService.insert(user);
    }

    /**
     * 編輯數據
     *
     * @param user 實體
     * @return 編輯結果
     */
    @PutMapping
    public JsonWrite edit(@RequestBody User user) {
        return this.userService.update(user);
    }

    /**
     * 刪除數據
     *
     * @param id 主鍵
     * @return 刪除是否成功
     */
    @DeleteMapping("{id}")
    public JsonWrite deleteById(@PathVariable("id") Integer id) {
        return this.userService.deleteById(id);
    }
}

分析:

上面我們創建了一個UserController類,使用@RequestMapping(“user”)注解,這樣前端使用user接口調用都是進入此類中查詢對應的接口;然后我們定義了五個基礎方法,分別是:分頁查詢、通過注解id查詢、新增、修改和刪除;下面我們分析這五個接口對應的寫法

  • 分頁查詢:
/**
     * 分頁查詢
     *
     * @param tableGrid  篩選條件
     * @return 查詢結果
     */
    @GetMapping
    public JsonWrite queryByPage(TableGrid tableGrid) {
        return JsonWrite.SUCCESS(this.userService.queryByPage(tableGrid));
    }

查詢都是Get請求,這個不用多說!前端使用接口名稱/user,并使用的是Get請求,則會進入方法中,方法參數是封裝的分頁實體,因為查詢列表的方法也是不可能有業務判斷或者業務報錯的,所以直接使用JsonWrite.SUCCESS返回給前端,查詢的數據是通過userService.queryByPage在userService的服務層處理,而JsonWrite.SUCCESS參數就是我們封裝的JsonWrite返回到前端的data屬性,前端在實體中通過.data獲取返回的查詢到的數據!

  • 通過注解id查詢
/**
     * 通過主鍵查詢單條數據
     *
     * @param id 主鍵
     * @return 單條數據
     */
    @GetMapping("{id}")
    public JsonWrite queryById(@PathVariable("id") Integer id) {
        return JsonWrite.SUCCESS(this.userService.queryById(id));
    }

同樣是獲取數據的Get請求,前端使用接口名稱/user/3,這里的3是指要查詢的數據id,方法正確使用get請求之后進入此方法中,通過@PathVariable("id")注解后臺可以直接使用到參數id,由于通過id查詢的這個id肯定是數據庫存在的,所以這里同樣使用JsonWrite.SUCCESS直接成功返回數據!

  • 新增
/**
     * 新增數據
     *
     * @param user 實體
     * @return 新增結果
     */
    @PostMapping
    public JsonWrite add(@RequestBody User user) {
        return this.userService.insert(user);
    }

新增為Post請求,咱們不多說!前端使用/user接口以及Post請求方式將會進入此方法中,前端傳入的是一個實體對象,所以我們使用@RequestBody來注明我們接受的數據是一個User對象,因為新增的時候一般會有業務判斷,比如用戶名是否存在之類的,如果重復了存在了則是新增失敗,所以我們再Controller中返回的是一個userService.insert服務層返回的結果,我們看下服務層代碼:

/**
     * 新增數據
     *
     * @param user 實例對象
     * @return 實例對象
     */
    @Override
    public JsonWrite insert(User user) {
        int count = this.userDao.insert(user);
        if(count >0){
            return JsonWrite.SUCCESS("數據新增成功!");
        }else{
            return JsonWrite.ERROR("數據新增失敗,請檢查數據!");
        }
    }

這里在服務層的新增接口中可以看到,這里是做了一個簡單的判斷,因為對于mysql來說,執行新增操作如果成功會返回執行成功的條數,也就是新增一條數據成功會返回一個Integer類型的1,如果失敗則為0,直接判斷count執行數據庫的結果來返回數據,前端使用JsonWrite的success屬性是否為true來判斷是否成功!

  • 修改
/**
     * 編輯數據
     *
     * @param user 實體
     * @return 編輯結果
     */
    @PutMapping
    public JsonWrite edit(@RequestBody User user) {
        return this.userService.update(user);
    }

修改為Put請求,前端直接使用/user并使用put請求方式即進入當前方法中,使用@RequestBody注解接收需要被修改的User對象數據,然后執行userService.update中的修改接口,因為修改的業務基本上都需要有判斷所以這里直接就是返回的服務層接口,判斷是否通過以及返回前臺的數據由服務層處理!

  • 刪除
/**
     * 刪除數據
     *
     * @param id 主鍵
     * @return 刪除是否成功
     */
    @DeleteMapping("{id}")
    public JsonWrite deleteById(@PathVariable("id") Integer id) {
        return this.userService.deleteById(id);
    }

刪除請求方式為delete,這里只是簡單的通過id刪除數據,從前臺傳入一個id即可,傳入的方式與通過id獲取是一樣的,/user/3這里的3是指需要被刪除的對象的id,因為刪除也是有很多的業務判斷,所以返回的數據結果有service的服務層處理。

小結

提示:細心的同學可能已經發現了,能夠直接出結果的都是查詢接口,不能出結果的都是操作的數據,針對數據庫來說就是‘查詢數據’和‘操作數據’,凡是查詢數據的都不應該會有問題,所以直接的success,而操作數據的都有可能伴隨著業務的判斷是失敗所以是在業務層中區處理返回對象

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8777

    瀏覽量

    152417
  • 數據
    +關注

    關注

    8

    文章

    7223

    瀏覽量

    90194
  • 封裝
    +關注

    關注

    127

    文章

    8157

    瀏覽量

    143873
  • Restful
    +關注

    關注

    0

    文章

    11

    瀏覽量

    3584
收藏 人收藏

    評論

    相關推薦

    編寫restful

    求助,有沒有兄弟做過相關的項目啊,現在寫了一個程序作為一個web service,基于restful。 需要將采集到的數據經過wifi傳輸,數據傳輸想用到restful。有沒有推薦的自帶的restful的wifi模塊,或者有沒有
    發表于 03-22 18:12

    FPGA實戰演練邏輯篇39:代碼風格與書寫規范

    代碼風格與書寫規范本文節選自特權同學的圖書《FPGA設計實戰演練(邏輯篇)》配套例程下載鏈接:http://pan.baidu.com/s/1pJ5bCtt 不同的人可能對代碼風格和代碼書寫
    發表于 06-19 10:38

    restful api設計規范

    清晰、符合標準、易于理解以及擴展方便等特點,受到越來越多網站的采用!Restful API接口規范包括以下部分:一、協議API與用戶的通信協議,總是使用HTTPs協議。二、域名應該盡量將API部署在
    發表于 03-26 16:26

    python restful api學習技巧精選2

    python restful api 學習筆記2 快速開始
    發表于 09-16 13:39

    一文知道后端接口開發json,jsonp,restful

    json、jsonp/** * 后臺接口開發 * json接口 * jsonp接口(解決跨域問題) * restful接口 */const
    發表于 11-04 07:22

    什么是restful以及restfulAPI的設計風格?

    如何理解restful架構?什么是restful API ? restful API的設計風格和序列化?restful API之請求與響應
    發表于 11-04 08:25

    傳輸設備PDH接口對接問題

    設備對接是任何通信工程中非常重要的一個環節,設備對接的好壞直接影響到通信質量。而我們在設備對接中也經常會遇到PDH接口對接,下面我們將從設備
    發表于 07-26 09:34 ?2818次閱讀

    接接頭系數及選取

    接接頭系數是指對接接接頭強度與母材強度之比值。用以反映由于焊接材料、焊接缺陷和焊接殘余應力等因素使焊接接頭強度被削弱的程度,是焊接接頭力
    發表于 11-30 14:09 ?4808次閱讀
    焊<b class='flag-5'>接接</b>頭系數及選取

    接接頭形式分類

    接接頭的主要基本形式有四種:對接接頭、T型接頭、角接接頭和搭接接頭。焊接接頭分類的原則僅根據焊接接
    發表于 11-30 14:13 ?9419次閱讀

    Constrained RESTful Environments (CoRE) Link Format

    Constrained RESTful Environments (CoRE) link Format,受限的RESTful環境鏈路格式
    發表于 11-26 15:23 ?6次下載

    接接頭形式圖_焊接接頭形式有哪幾種

    接接頭形式:對接接頭、角接接頭及T字形接頭、搭接接頭。
    發表于 11-20 10:28 ?4.4w次閱讀
    焊<b class='flag-5'>接接</b>頭形式圖_焊<b class='flag-5'>接接</b>頭形式有哪幾種

    RESTful API設計規范

    REST(REpresentational State Transfer)是 Roy Fielding 博士于 2000 年在他的博士論文中提出來的一種軟件架構風格(一組架構約束條件和原則)。在該論文的 中文譯本 中翻譯是"表述性狀態移交"。
    的頭像 發表于 07-10 09:30 ?1165次閱讀

    構建RESTful Web服務的過程

    本指南將引導您完成使用 Spring 創建“Hello, World”RESTful Web 服務的過程。
    的頭像 發表于 09-06 15:47 ?770次閱讀

    接接頭系數選取方法 焊接接頭系數的確定原則是什么

    接接頭系數Φ是指對接接接頭強度與母材強度之比值,用以反映由于焊接缺陷和焊接殘余應力等因素使焊接接頭強度被削弱的程度,是焊接接頭力學性能的
    的頭像 發表于 08-08 11:49 ?4885次閱讀

    REST的6大指導原則

    systems )架構風格。由Roy Fielding 提出。 REST API 也稱RESTful API, 其遵循REST架構規范的應用編程接口, 支持與
    的頭像 發表于 10-09 14:27 ?1780次閱讀
    主站蜘蛛池模板: 亚洲一区在线观看视频 | 99精品视频 | 精品人妻伦一二三区久久AAA片 | 91精品专区 | 狼群资源网中文字幕 | 波多野结衣教师系列6 | 一个人免费视频在线观看高清频道 | 永久免费在线看mv | 免费毛片试看 | 丰满五十六十老熟女HD60 | 大中国免费视频大全在线观看 | jyzzjyzzz视频国产在线观看 | 全黄H全肉细节文短篇 | 日本ccc三级| 亚洲精品一区国产欧美 | 秋霞网站一级一片 | 日本不卡一二三 | 蜜桃婷婷狠狠久久综合9色 蜜桃视频一区二区 | 亚洲国产成人精品青青草原100 | 用快播看av的网站 | 国产成人8x视频一区二区 | 国产网站免费观看 | 色欲无码国产喷水AV精品 | 亚洲AV久久无码精品热九九 | 欧美の无码国产の无码影院 | 伊人精品国产 | 草莓AV福利网站导航 | 2018久久视频在线视频观看 | 久久久大香菇 | 久久久久亚洲日日精品 | 九九精品久久 | 破苞流血哭泣 magnet | 中文字幕在线免费视频 | 99国产精品免费视频 | 伊人精品影院一本到综合 | 伊人青青久久 | 欧美激情精品久久久久久不卡 | 99国产强伦姧在线看RAPE | 欧美视频精品一区二区三区 | 边做边爱免费视频播放 | 97视频在线播放 |