在http原本的定義中
[rfc2616],用於上傳資料的方法只有post和put。後來鑑於post和put語義和功能上的不足,又加入了patch方法
[rfc5789]。post與put方法的差異是顯而易見的,而put與patch方法就比較相似,但它們的用法卻完全不同。
put方法和patch方法所請求的目標位址都是直接指向資源的,而post方法請求的目標是乙個行為處理器,這點很容易區分。但put和patch呢?根據規範中所介紹的put用於替換資源,而patch用於更新部分資源。僅憑這個描述,我無法理解他們的區別,直到看到後面介紹patch是非冪等的時候才恍然大悟。
從這裡開始要考慮乙個問題,patch為什麼是非冪等的呢?post方法非冪等可以理解,因為它請求伺服器執行乙個動作,多次發起請求可能導致動作多次執行。而像patch這樣請求的目標是乙個資源的,如果它只是更新乙個資源,不執行其它動作,又何來不冪等呢?其實是我忽略了乙個問題,patch方法和post方法有個很相似的地方,它們的實體部分都是結構化的資料。post方法的實體結構一般是
multipart/form-data 或
put方法的實體無結構的,它直接把實體部分的資料替換到伺服器的資源上。而patch提供的實體則需要根據程式或其它協議的定義,解析後在伺服器上執行,以此來修改伺服器上的資料。也就是說,patch請求是會執行某個程式的,如果重複提交,程式可能執行多次,對伺服器上的資源就可能造成額外的影響,這就可以解釋它為什麼是不冪等的了。
舉個例子,如果伺服器上有個資源
/abc.int,裡面存放乙個整數,值為
1。也就是說,get這個資源的話,伺服器響應的實體只包含了
1 這個數字。現在在自己的框架中定義當提交patch請求,實體匹配
^\+\d+$的格式時就對伺服器資源中的數字執行乙個加法操作。於是當客戶端向
/abc.int位址發起patch請求,實體部分為
+3之後,伺服器的
/abc.int資源中的資料就變成
4,也就是說,get它會得到
4。如果客戶端不小心重複提交了patch請求,那麼
+3就會被再執行一次,這個資源的資料就變成
7。這麼一看,patch和put的區別就非常明顯了吧。
補丁 patch 的製作與應用
用到的兩個命令是diff和patch。diff可以比較兩個東西,並可同時記錄下二者的區別。製作補丁時的一般用法和常見選項為 diff 選項 原始檔 夾 目的檔案 夾 r 遞迴。設定後diff會將兩個不同版本源 目錄中的所有對應檔案全部都進行一次比較,包括子目錄檔案。n選項確保補丁檔案將正確地處理已經...
《Linux diff與patch的深入分析》
diff的輸出格式分為傳統格式和統一格式 1 diff的傳統格式輸出.cat before.txt 輸出 this is a line to be deleted this is a line that will be changed this is a line that will be unch...
Linux下diff命令與patch命令使用
1 製作補丁 diff的使用 diff可以完成比較功能,生成補丁檔案 格式 diff option oldfile newfile 常用的option選項有 n 補丁中包含整個新檔案 a 補丁中包含二進位制檔案 預設時,diff向標準輸出列印,所以一般都重定向到檔案並以patch為字尾,也就是所謂的...