0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

get與post的請(qǐng)求一些區(qū)別

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 作者:馬哥Linux運(yùn)維 ? 2022-09-07 10:00 ? 次閱讀

目錄

背景

get 與 post 的區(qū)別

所有接口都用 post 請(qǐng)求?

背景

最近在逛知乎的時(shí)候發(fā)現(xiàn)一個(gè)有趣的問題:公司規(guī)定所有接口都用 post 請(qǐng)求,這是為什么?

看到這個(gè)問題的時(shí)候其實(shí)我也挺有感觸的,因?yàn)槲乙苍?jīng)這樣問過我自己。在上上一家公司的時(shí)候接到一個(gè)項(xiàng)目是從零開始搭建一個(gè)微服務(wù),當(dāng)時(shí)就有了解過接口的一些規(guī)范,比如耳熟能詳?shù)?Restful 規(guī)范,就被應(yīng)用到這個(gè)微服務(wù)項(xiàng)目中。

get 與 post 的區(qū)別

今天再次看到這個(gè)問題,我也有了一些新的理解和感觸,臨時(shí)回顧了一下 get 與 post 的請(qǐng)求的一些區(qū)別。

如下:

post 更安全(不會(huì)作為 url 的一部分,不會(huì)被緩存、保存在服務(wù)器日志、以及瀏覽器瀏覽記錄中)

post 發(fā)送的數(shù)據(jù)更大(get 有 url 長(zhǎng)度限制)

post 能發(fā)送更多的數(shù)據(jù)類型(get 只能發(fā)送 ASCII 字符)

post 比 get 慢

post 用于修改和寫入數(shù)據(jù),get 一般用于搜索排序和篩選之類的操作

get 請(qǐng)求的是靜態(tài)資源,則會(huì)緩存,如果是數(shù)據(jù),則不會(huì)緩存

查看上面的區(qū)別,就會(huì)發(fā)現(xiàn) post 在發(fā)送數(shù)據(jù)量大的請(qǐng)求時(shí)優(yōu)勢(shì)很顯示,get 則更適合獲取靜態(tài)資源、簡(jiǎn)單的查詢等接口。

我個(gè)人在開發(fā)接口的時(shí)候也會(huì)注意,將簡(jiǎn)單的查詢請(qǐng)求使用 get 方法,其他增、刪、改、復(fù)雜的查詢請(qǐng)求都可以使用 post,但不會(huì)像題主的公司一樣全部使用 post。

所有接口都用 post 請(qǐng)求?

| 網(wǎng)友程墨 Morgan

網(wǎng)友程墨 Morgan 提出如果是自己會(huì)按照『業(yè)界最佳實(shí)踐』制定規(guī)范:

| 網(wǎng)友蘇莉安

另外一個(gè)知友提出:就是為了遷就低水平不思進(jìn)取的架構(gòu)師和前后端程序員們。

| 網(wǎng)友大寬寬

大寬寬的回答:我打算跳出技術(shù)的范疇,從 ROI 的角度討論下如果一個(gè)架構(gòu)風(fēng)格(比如 Restful)真的那么好,為啥應(yīng)用上沒有那么廣泛? 首先要明確,不管你多么喜歡技術(shù),無論是這里說的一個(gè) http 的 method,又或者是編程語言的一些用法、架構(gòu)設(shè)計(jì)方法、甚至是 OKR 這樣的管理和溝通的方法。這一切,都是為了滿足企業(yè)對(duì)市場(chǎng)的需求。 簡(jiǎn)單來說,公司給你發(fā)工資,不是為了讓你遵守規(guī)范的,而是為了能在成本可接受的情況下,讓業(yè)務(wù)落地。而其中,一般情況下,接口的形式是個(gè)微不足道的局部問題。 對(duì)于企業(yè)來講,技術(shù)團(tuán)隊(duì)要解決的更重要的問題:

是理解業(yè)務(wù)模型,形成業(yè)務(wù)架構(gòu)和可以穩(wěn)定跑的系統(tǒng);

是面對(duì)大量涌入用戶對(duì)系統(tǒng)可用性的要求對(duì)系統(tǒng)不會(huì)卡頓掛機(jī)的擴(kuò)展性保障;

是不會(huì)動(dòng)不動(dòng)抽瘋一下,丟條數(shù)據(jù)或者數(shù)據(jù)沖突的穩(wěn)定性要求,以及為了達(dá)成這些要求給監(jiān)控體系的各種便利。

但一定要糾結(jié)下 POST/GET,以及 Restful。好吧,Restful 能明確列出來的好處,就那么幾點(diǎn)(如果有疏漏的請(qǐng)?jiān)谠u(píng)論區(qū)里補(bǔ)充)。 如下:

表達(dá)不同的業(yè)務(wù)動(dòng)作語義:GET/POST/PATCH/PUT/DELETE……,

表達(dá)“資源”的概念利用

url path,querystring,header,status code 等來表達(dá)很多接口功能

以上兩條可以達(dá)成一種“統(tǒng)一”的接口表達(dá)形式,以至于可以圍繞這個(gè)形式實(shí)現(xiàn)接口維護(hù)的工具,比如 swagger。

Get 資源可以利用緩存

但代價(jià)是什么? ①強(qiáng)行的統(tǒng)一,讓本來天然不是資源的業(yè)務(wù)概念也一定要強(qiáng)行“資源“一下,引發(fā)了更多的理解不一致和溝通困難。 當(dāng)然,事物總是和可以“抽象”一下,業(yè)務(wù)概念抽象為“資源”很多時(shí)候都是可行的。但這這么做的收益除了證明“一個(gè)人聰明,有不錯(cuò)的抽象能力“,以及“更容易利用上 swagger 一類的工具“之外,我看不到啥額外的短期或者長(zhǎng)期收益。 亂折騰 path,querysting 等東西,讓橫切面治理抓取關(guān)鍵信息更難了。比如監(jiān)控時(shí)抓一個(gè) path 里帶變量的 url 是非常惡心的事情。 又或者看到一個(gè) 404 的報(bào)警,卻根本搞不清楚到底是服務(wù)部署有問題;還是服務(wù)正常,但用戶不存在;又或者是用戶存在,但用戶訂單不存在。帶來的問題是運(yùn)營(yíng)工具編寫困難,線上問題響應(yīng)能力會(huì)被降低。 即使使用 swagger,還是需要寫說明和文檔來說明其業(yè)務(wù)語義。接口工具應(yīng)該提供的“好理解,接口改了后文檔自動(dòng)生成”等好處,只有在接口反應(yīng)的資源剛好和后臺(tái)數(shù)據(jù)表/視圖能夠?qū)?yīng)上才有效。 也就是說只適合接口層級(jí)低的場(chǎng)景下有用,而對(duì)高層接口意義不大。結(jié)果開發(fā)者既要用 swagger 這樣的工具,同時(shí)還是要看常規(guī)文檔。本來用一套機(jī)制可以解決的問題要改成兩套。 Cache 雖好,但最怕的是管控不到位讓用戶拿到了過期數(shù)據(jù)。對(duì)于 Cache,業(yè)務(wù)上一般會(huì)區(qū)分動(dòng)態(tài)接口和靜態(tài)接口。 前者默認(rèn)不應(yīng)該有 cache,所以用了 Get 之后為了防范,還得手工在大部分動(dòng)態(tài)接口上加 Cache-Control: no-cache,或者動(dòng)態(tài)產(chǎn)生 ETag(浪費(fèi) CPU)。而后者一般會(huì)采用 CDN,這一套針對(duì) cache 做了很精巧的設(shè)計(jì)。 使用形式各異的 method 和 url path,querystring 上做各種奇怪的拼接,會(huì)給前端帶來巨大的困擾。 因?yàn)楸緛硪粋€(gè)函數(shù)調(diào)用,還得翻譯一遍,活生生的弄出來一個(gè)接口翻譯層。妥妥的降低人效。如果是 web,iOS,Android 三套前端,就得弄 3 個(gè)接口翻譯層。 非 GET 和 POST 之外的 method 有可能會(huì)被不恰當(dāng)?shù)木W(wǎng)關(guān)轉(zhuǎn)發(fā)規(guī)則給干掉。為此 Restful 還是搞出了 method override 這樣的招數(shù)…… 所以到底適不適合,落地時(shí)聽罵聲和吵架聲就知道了。 有人舉了 Google S3 運(yùn)用 Restful 接口的例子來說明其正確性。但 S3 是干什么的大家都懂,S3 天然就是用來存取“資源“的。 一個(gè)工具用在了恰當(dāng)場(chǎng)景,當(dāng)然是“正確“的。S3 用的好的東西,只能說明類似的阿里云 OSS,騰訊云 COS 也可以這么干。但無法證明電商業(yè)務(wù)、社交業(yè)務(wù)、I 醫(yī)療業(yè)務(wù)、政企辦公協(xié)同……這些業(yè)務(wù)也適合這么干。 而作為技術(shù)負(fù)責(zé)人,如果他搞出了一套接口方案(也許其中一條就是所有 http 接口都用 post),提高了開發(fā)效率,降低了溝通成本,降低了運(yùn)維和錯(cuò)誤定位成本,為企業(yè)真正做到了降本增效。 把瞎折騰的成本,投入到了其他比如業(yè)務(wù)架構(gòu)設(shè)計(jì),測(cè)試體系,線上監(jiān)控,容災(zāi)降級(jí)等領(lǐng)域上。 最終讓企業(yè)(用戶需求得到滿足,收入增加)和員工得到了收益(因?yàn)楣臼杖朐黾佣鴿q薪)。 我會(huì)評(píng)價(jià)這樣的人為“真正懂架構(gòu),懂技術(shù),善于用技術(shù)解決實(shí)際問題。水平不知道高到哪里去了”。 如果一個(gè)技術(shù)負(fù)責(zé)人只知道遵守一個(gè)書上寫的,但從沒驗(yàn)證過在自己的環(huán)境有效的方案,以至于讓企業(yè)的核心目標(biāo)無法達(dá)成。他就是趙括,該馬上卷鋪蓋卷走人。 至于我司,使用的規(guī)范是:對(duì)于動(dòng)態(tài)業(yè)務(wù)接口,只有一個(gè)接口 POST/action,在 Header 里給 X-Action 給出具體的接口名稱交給網(wǎng)關(guān)路由,session 表示用戶登錄身份,以及用于推薦、防重、染色、安全用到的各種 token/簽名。 所有的業(yè)務(wù)請(qǐng)求參數(shù)都以 PB 編碼后放在請(qǐng)求體里,并和后端的 gRPC 體系銜接。接口除了防重試之外,不提供常規(guī)意義上的 Cache。 而對(duì)于靜態(tài)接口,走 CDN,做多級(jí) Cache。該用 Get 用 Get。如果一個(gè)動(dòng)態(tài)接口也想利用 http 層 Cache,可以向網(wǎng)關(guān)申請(qǐng)和配置。有沒有 Cache,cache 多久是網(wǎng)關(guān)和端上自己實(shí)施的,完全自己管控。 各位讀者可以參考看看,并根據(jù)自己所處的業(yè)務(wù)場(chǎng)景和前后端交互思考下“我們目前用的技術(shù)規(guī)范是性價(jià)比最高的嗎,是最合適的嗎?“ 如果是你來設(shè)計(jì)公司的 API 規(guī)范,會(huì)規(guī)定所有接口都用 post 請(qǐng)求嗎,這是為什么?

審核編輯:彭靜

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7249

    瀏覽量

    91401
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9730

    瀏覽量

    87472
  • 瀏覽器
    +關(guān)注

    關(guān)注

    1

    文章

    1040

    瀏覽量

    36155

原文標(biāo)題:新來的 CTO 規(guī)定所有接口都用 post 請(qǐng)求...

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問GSM模塊POST方式發(fā)送數(shù)據(jù)失敗,GET請(qǐng)求卻成功了是怎么回事?

    POST請(qǐng)求數(shù)據(jù)寫進(jìn)去失敗了,GET請(qǐng)求成功,不知道是不是POST指令寫錯(cuò)了,求原子哥解答POST
    發(fā)表于 06-11 04:35

    GETPOST請(qǐng)求示例流程

    WebClient軟件包提供兩個(gè)HTTPClient示例程序,分別用于演示軟件包支持的GETPOST功能,完成數(shù)據(jù)的上傳與下載。
    發(fā)表于 04-02 06:34

    如何通過GETPOST請(qǐng)求控制pwm占空比?

    我已經(jīng)將我的 ESP 設(shè)置為訪問點(diǎn),并嘗試通過 GETPOST 請(qǐng)求控制 pwm 占空比。我在 html 端使用以下 jquery 代碼:代碼:全選$.post("http
    發(fā)表于 02-28 08:03

    如何對(duì)Google Cloud IoT Core Pub/Sub的http POST發(fā)送請(qǐng)求?

    : no-cache\' \\ --data \'{\"binary_data\": \"aGVsbG8K\"}\' \\ 任何人都可以分享一些關(guān)于如何發(fā)送 POST 請(qǐng)求的代碼片段,包括在
    發(fā)表于 04-27 07:17

    一些關(guān)于iOS面試會(huì)問到的問題總結(jié)

    的還行,有點(diǎn)感覺不太好,主要是有些英文單詞說的太low了估計(jì)被鄙視了吧,下面給大家總結(jié)下面試的一些問題,有些回答是摘要一些大神blog的出處,都有給原鏈接,希望見諒~~ 簡(jiǎn)單講解
    發(fā)表于 09-25 15:18 ?0次下載
    <b class='flag-5'>一些</b>關(guān)于iOS面試會(huì)問到的問題總結(jié)

    http請(qǐng)求 get post

    ; importjava.util.List; importjava.util.Map;publicclassHttpRequest{/** * 向指定URL發(fā)送GET方法的請(qǐng)求 * *@paramurl * 發(fā)送請(qǐng)求
    發(fā)表于 09-27 10:36 ?18次下載

    PHP中REQUEST和POSTGET有什么區(qū)別

    PHP中有$_REQUEST與$_POST、$_GET用于接受表單數(shù)據(jù)。 、$_REQUEST與$_POST、$_GET
    發(fā)表于 02-19 14:26 ?2次下載
    PHP中REQUEST和<b class='flag-5'>POST</b>及<b class='flag-5'>GET</b>有什么<b class='flag-5'>區(qū)別</b>

    Java中GetPost的使用

    Java中GetPost的使用
    的頭像 發(fā)表于 01-12 15:38 ?1036次閱讀
    Java中<b class='flag-5'>Get</b>和<b class='flag-5'>Post</b>的使用

    Java中restTemplate攜帶Header請(qǐng)求

    :userName}" ); 創(chuàng)建請(qǐng)求方式: HttpEntity POST請(qǐng)求 restTemplate發(fā)送POST請(qǐng)求時(shí)可以通過如下方法
    的頭像 發(fā)表于 03-09 14:43 ?1403次閱讀

    HTTP請(qǐng)求報(bào)文:GETPOST區(qū)別

    GETPOST 其實(shí)都是 HTTP 的請(qǐng)求方法。除了這 2 個(gè)請(qǐng)求方法之外,HTTP 還有 HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS 這 6 個(gè)
    發(fā)表于 04-10 10:11 ?2856次閱讀

    HTTP中GETPOST區(qū)別是什么?

    GETPOST是HTTP請(qǐng)求的兩種基本方法,要說它們的區(qū)別,接觸過WEB開發(fā)的人都能說出一二。 最直觀的區(qū)別就是
    發(fā)表于 08-05 12:21 ?623次閱讀

    所有接口都用post請(qǐng)求的原因

    查看上面的區(qū)別,就會(huì)發(fā)現(xiàn)post在發(fā)送數(shù)據(jù)量大的請(qǐng)求時(shí)優(yōu)勢(shì)很顯示,get則更適合獲取靜態(tài)資源、簡(jiǎn)單的查詢等接口。 我個(gè)人在開發(fā)接口的時(shí)候也會(huì)注意,將簡(jiǎn)單的查詢
    發(fā)表于 08-24 10:06 ?561次閱讀
    所有接口都用<b class='flag-5'>post</b><b class='flag-5'>請(qǐng)求</b>的原因

    冪等和非冪等請(qǐng)求一些定義和分析

    最近在做項(xiàng)目的過程中,有個(gè)需求是在客戶端 HTTP 請(qǐng)求失敗后,增加個(gè)重試機(jī)制,然后我就翻了一些有關(guān)“重試”的庫,找到個(gè) axios-
    的頭像 發(fā)表于 10-17 10:50 ?1103次閱讀

    HTTP 中GETPOST區(qū)別

    、概述 HTTP 的請(qǐng)求報(bào)文 GET 方法的特點(diǎn) POST 方法的特點(diǎn) GETPOST
    的頭像 發(fā)表于 11-11 14:40 ?1270次閱讀
    HTTP 中<b class='flag-5'>GET</b> 和 <b class='flag-5'>POST</b> 的<b class='flag-5'>區(qū)別</b>

    鴻蒙OS開發(fā)實(shí)戰(zhàn):【網(wǎng)絡(luò)管理HTTP數(shù)據(jù)請(qǐng)求

    應(yīng)用通過HTTP發(fā)起個(gè)數(shù)據(jù)請(qǐng)求,支持常見的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。
    的頭像 發(fā)表于 04-01 16:31 ?1080次閱讀
    鴻蒙OS開發(fā)實(shí)戰(zhàn):【網(wǎng)絡(luò)管理HTTP數(shù)據(jù)<b class='flag-5'>請(qǐng)求</b>】

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品