公司規定所有介面都用 post 請求,這正確麽?

来源:https://www.cnblogs.com/dotnet-college/archive/2023/01/29/17073634.html
-Advertisement-
Play Games

目錄 背景 get 與 post 的區別 所有介面都用 post 請求? 背景 最近在逛知乎的時候發現一個有趣的問題:公司規定所有介面都用 post 請求,這是為什麼? 看到這個問題的時候其實我也挺有感觸的,因為我也曾經這樣問過我自己。在上上一家公司的時候接到一個項目是從零開始搭建一個微服務,當時就 ...


目錄

  • 背景
  • get 與 post 的區別
  • 所有介面都用 post 請求?

背景

最近在逛知乎的時候發現一個有趣的問題:公司規定所有介面都用 post 請求,這是為什麼?

看到這個問題的時候其實我也挺有感觸的,因為我也曾經這樣問過我自己。在上上一家公司的時候接到一個項目是從零開始搭建一個微服務,當時就有瞭解過介面的一些規範,比如耳熟能詳的 Restful 規範,就被應用到這個微服務項目中。

get 與 post 的區別

今天再次看到這個問題,我也有了一些新的理解和感觸,臨時回顧了一下 get 與 post 的請求的一些區別。

如下:

  • post 更安全(不會作為 url 的一部分,不會被緩存、保存在伺服器日誌、以及瀏覽器瀏覽記錄中)
  • post 發送的數據更大(get 有 url 長度限制)
  • post 能發送更多的數據類型(get 只能發送 ASCII 字元)
  • post 比 get 慢
  • post 用於修改和寫入數據,get 一般用於搜索排序和篩選之類的操作
  • get 請求的是靜態資源,則會緩存,如果是數據,則不會緩存

查看上面的區別,就會發現 post 在發送數據量大的請求時優勢很明顯,get 則更適合獲取靜態資源、簡單的查詢等介面。

我個人在開發介面的時候也會註意,將簡單的查詢請求使用 get 方法,其他增、刪、改、複雜的查詢請求都可以使用 post,但不會像題主的公司一樣全部使用 post。

所有介面都用 post 請求?

網友程墨 Morgan

網友程墨 Morgan 提出如果是自己會按照『業界最佳實踐』制定規範:

 

網友蘇莉安

另外一個知友提出:就是為了遷就低水平不思進取的架構師和前後端程式員們。

 

網友大寬寬

大寬寬的回答:我打算跳出技術的範疇,從 ROI 的角度討論下如果一個架構風格(比如  Restful)真的那麼好,為啥應用上沒有那麼廣泛?

首先要明確,不管你多麼喜歡技術,無論是這裡說的一個 http 的 method,又或者是編程語言的一些用法、架構設計方法、甚至是 OKR 這樣的管理和溝通的方法。這一切,都是為了滿足企業對市場的需求。

簡單來說,公司給你發工資,不是為了讓你遵守規範的,而是為了能在成本可接受的情況下,讓業務落地。而其中,一般情況下,介面的形式是個微不足道的局部問題。

對於企業來講,技術團隊要解決的更重要的問題:

  • 是理解業務模型,形成業務架構和可以穩定跑的系統;
  • 是面對大量涌入用戶對系統可用性的要求對系統不會卡頓掛機的擴展性保障;
  • 是不會動不動抽瘋一下,丟條數據或者數據衝突的穩定性要求,以及為了達成這些要求給監控體系的各種便利。

但一定要糾結下 POST/GET,以及 Restful。好吧,Restful 能明確列出來的好處,就那麼幾點(如果有疏漏的請在評論區里補充)。

如下:

  • 表達不同的業務動作語義:GET/POST/PATCH/PUT/DELETE……,
  • 表達“資源”的概念利用
  • url path,querystring,header,status code 等來表達很多介面功能
  • 以上兩條可以達成一種“統一”的介面表達形式,以至於可以圍繞這個形式實現介面維護的工具,比如 swagger。
  • Get 資源可以利用緩存

但代價是什麼?

①強行的統一,讓本來天然不是資源的業務概念也一定要強行“資源“一下,引發了更多的理解不一致和溝通困難。

當然,事物總是可以“抽象”一下,業務概念抽象為“資源”很多時候都是可行的。但這這麼做的收益除了證明“一個人聰明,有不錯的抽象能力“,以及“更容易利用上 swagger 一類的工具“之外,我看不到啥額外的短期或者長期收益。

②亂折騰 path,querysting 等東西,讓橫切麵治理抓取關鍵信息更難了。 比如監控時抓一個 path 裡帶變數的 url 是非常噁心的事情。

又或者看到一個 404 的報警,卻根本搞不清楚到底是服務部署有問題;還是服務正常,但用戶不存在;又或者是用戶存在,但用戶訂單不存在。帶來的問題是運營工具編寫困難,線上問題響應能力會被降低。

③即使使用 swagger,還是需要寫說明和文檔來說明其業務語義。 介面工具應該提供的“好理解,介面改了後文檔自動生成”等好處,只有在介面反應的資源剛好和後臺數據表/視圖能夠對應上才有效。

也就是說只適合介面層級低的場景下有用,而對高層介面意義不大。結果開發者既要用 swagger 這樣的工具,同時還是要看常規文檔。本來用一套機制可以解決的問題要改成兩套。

④Cache 雖好,但最怕的是管控不到位讓用戶拿到了過期數據。 對於 Cache,業務上一般會區分動態介面和靜態介面。

前者預設不應該有 cache,所以用了 Get 之後為了防範,還得手工在大部分動態介面上加 Cache-Control: no-cache,或者動態產生 ETag(浪費 CPU)。而後者一般會採用 CDN,這一套針對 cache 做了很精巧的設計。

⑤使用形式各異的 method 和 url path,querystring 上做各種奇怪的拼接,會給前端帶來巨大的困擾。

因為本來一個函數調用,還得翻譯一遍,活生生的弄出來一個介面翻譯層。妥妥的降低人效。如果是 web,iOS,Android 三套前端,就得弄 3 個介面翻譯層。

⑥非 GET 和 POST 之外的 method 有可能會被不恰當的網關轉發規則給幹掉。 為此 Restful 還是搞出了 method override 這樣的招數……

所以到底適不適合,落地時聽罵聲和吵架聲就知道了。

有人舉了 Google S3 運用 Restful 介面的例子來說明其正確性。但 S3 是乾什麼的大家都懂,S3 天然就是用來存取“資源“的。

一個工具用在了恰當場景,當然是“正確“的。S3 用的好的東西,只能說明類似的阿裡雲 OSS,騰訊雲 COS 也可以這麼乾。但無法證明電商業務、社交業務、I 醫療業務、政企辦公協同……這些業務也適合這麼乾。

而作為技術負責人,如果他搞出了一套介面方案(也許其中一條就是所有 http 介面都用 post),提高了開發效率,降低了溝通成本,降低了運維和錯誤定位成本,為企業真正做到了降本增效。

把瞎折騰的成本,投入到了其他比如業務架構設計,測試體系,線上監控,容災降級等領域上。

最終讓企業(用戶需求得到滿足,收入增加)和員工得到了收益(因為公司收入增加而漲薪)。

我會評價這樣的人為“真正懂架構,懂技術,善於用技術解決實際問題。水平不知道高到哪裡去了”。

如果一個技術負責人只知道遵守一個書上寫的,但從沒驗證過在自己的環境有效的方案,以至於讓企業的核心目標無法達成。他就是趙括,該馬上捲鋪蓋捲走人。

至於我司,使用的規範是:

對於動態業務介面,只有一個介面 POST/action,在 Header 里給 X-Action 給出具體的介面名稱交給網關路由,session 表示用戶登錄身份,以及用於推薦、防重、染色、安全用到的各種 token/簽名。

所有的業務請求參數都以 PB 編碼後放在請求體里,並和後端的 gRPC 體系銜接。介面除了防重試之外,不提供常規意義上的 Cache。

而對於靜態介面,走 CDN,做多級 Cache。該用 Get 用 Get。如果一個動態介面也想利用 http 層 Cache,可以向網關申請和配置。有沒有 Cache,cache 多久是網關和端上自己實施的,完全自己管控。

各位讀者可以參考看看,並根據自己所處的業務場景和前後端交互思考下“我們目前用的技術規範是性價比最高的嗎,是最合適的嗎?“

如果是你來設計公司的 API 規範,會規定所有介面都用 post 請求嗎?


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 基礎知識 1.1 基本配置 main # 全局配置 events { # nginx 工作模式配置 } http { # http 設置 .... server { # 伺服器主機配置 .... location { # 路由配置 .... } location path { .... } l ...
  • 本文結合京東監控埋點場景,對解決樣板代碼的技術選型方案進行分析,給出最終解決方案後,結合理論和實踐進一步展開。通過關註文中的技術分析過程和技術場景,讀者可收穫一種樣板代碼思想過程和解決思路,並對Java編譯器底層有初步瞭解。 ...
  • 在golang中可以使用a := b這種方式將b賦值給a,只有當b能進行深拷貝時a與b才不會互相影響,否則就需要進行更為複雜的深拷貝。 下麵就是Go賦值操作的一個說明: Go語言中所有賦值操作都是值傳遞,如果結構中不含指針,則直接賦值就是深度拷貝;如果結構中含有指針(包括自定義指針,以及切片,map ...
  • 第一種方式:使用{} firstDict = {"name": "wang yuan wai ", "age" : 25} 說明:{}為創建一個空的字典對象 第二種方式:使用fromkeys()方法 second_dict = dict.fromkeys(("name", "age")) #valu ...
  • 如果您想查找高於或低於平均值的數字,可以不必計算該平均值,就能查看更高或更低的值。通過Java應用程式,可以自動突出顯示這些數字。除了快速突出顯示高於或低於平均值的值外,您還可以查看高於或低於的值的個數。現在讓我們看看如何在 Java應用程式中實現此操作。 引入jar包 導入方法1: 手動引入。將  ...
  • 幾乎所有的高級編程語言都有自己的垃圾回收機制,開發者不需要關註記憶體的申請與釋放,Python 也不例外。Python 官方團隊的文章 https://devguide.python.org/internals/garbage-collector 詳細介紹了 Python 中的垃圾回收演算法,本文是這篇 ...
  • 在新版本的pandas中,上述代碼會引起警告,建議改成SQLAlchemy connectable(engine/connection),後續代碼將引入這種升級的連接方式。 ...
  • *以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接 微信公眾號「englyf」https://mp.weixin.qq.com/s/2GFLTstDC7w6u3fTJxflNA 本文大概 1685 個字,閱讀需花 6 分鐘內容不多, 但也花了一些精力如要交流, 歡迎關註我然後評論區留言 謝謝你的 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...