SAP ABAP應用伺服器的HTTP響應狀態碼(Status Code)

2020-12-15 汪子熙的編程和遊泳

這是Jerry 2020年的第45篇文章,也是汪子熙公眾號總共第228篇原創文章。

最近Jerry參與了SAP Commerce Cloud的標準開發,我們調用微軟雲平臺Azure上創建Lambda Function的Restful API來創建Lambda Function:

https://docs.microsoft.com/en-us/rest/api/appservice/webapps/createfunction

在開發過程中發現該API工作不太穩定,同樣的輸入,時不時會返回HTTP 400 Bad Request:Encountered an error (InternalServerError) from host runtime

這個錯誤並不是總能重現。

通過排查,最後我們確認這個問題和我們調用API的代碼無關,於是給Azure報了一個bug:

在分析定位問題時,不由得讓我懷念起以前在ABAP On-Premise上做開發的一個便利之處——大多數問題都可以通過在ABAP應用伺服器端調試來找到根源。

本文記錄了2016年時,SAP成都研究院CRM開發團隊在開發SAP CRM Fiori應用時的一些技術討論,關於HTTP請求的響應狀態碼的差異。

當時我們用Chrome打開SAP Fiori應用,在Chrome開發者工具的network標籤裡,觀察到有的請求響應碼為HTTP 200,有的卻是HTTP 304.

HTTP 200HTTP 304理論上的差異解析,網上一搜一大把:

https://stackoverflow.com/questions/1665082/what-is-the-difference-between-http-status-code-200-cache-vs-status-code-304

本文我們從一個實際的例子出發,觀察ABAP伺服器分別是在何種情況下,返回HTTP 200304這兩個狀態碼的,幫助大家加深理解。

分幾種情況進行討論。

第一種情況:HTTP 200 OK第二種情況:HTTP 304 Not Modified第三種情況:HTTP 200(from Cache)

首先進行第一輪測試。

將這種來自SAP UI5標準庫文件的url粘貼到瀏覽器裡訪問:

https://<host>:7080/sap/bc/ui5_ui5/ui2/ushell/resources/~20160308134900~/sap/fiori/core-min-0.js

得到HTTP 200狀態碼:

大家想過沒有,上圖高亮的HTTP響應頭部欄位,比如last-modified, 是在ABAP伺服器上哪段代碼裡被填充的?

靈活運用Jerry文章 SAP錯誤消息調試之七種武器:讓所有的錯誤消息都能被定位介紹的辦法,順利通過調試的方式,找到準確的位置如下:

上述代碼的邏輯:

(1) 第九行,伺服器試圖從HTTP請求的頭部欄位中,提取名為If-Modified-Since的欄位值,因為這是我第一次請求該JavaScript文件,而這個欄位的值邏輯上應該等於第一次請求到達伺服器後,從伺服器返回的響應結構裡名為last-modified欄位的值。

在我的第一輪測試裡,因為是第一次請求該文件,HTTP請求頭部沒有包含If-Modified-Since欄位,所以伺服器解析出的值為空,即變量lv_modified_since為空。

(2) 在我使用的ABAP伺服器上,JavaScript文件core-min-0.js最後修改的時間戳為20160316205045. 因此,兩個變量lv_change_time_char和lv_change_time_string都被附上了這個值。

下面第20行代碼展示了前文HTTP 200狀態碼的截圖裡,HTTP響應欄位cache-control被填充的地方。

第二種情況:HTTP 304 Not Modified

之前Chrome瀏覽器裡打開的url:

https://<host>:7080/sap/bc/ui5_ui5/ui2/ushell/resources/~20160308134900~/sap/fiori/core-min-0.js

不用關閉這個瀏覽器窗口,直接按F5刷新,這次收到的響應碼不再是HTTP 200 OK,而是HTTP 304 Not Modified.

為什麼會產生這種差異呢?按F5之後仔細觀察請求頭部,發現第二次請求,瀏覽器發出的HTTP請求裡,If-Modified-Since欄位包含的就是第一個請求裡從伺服器端返回的last-modified欄位值。

按F5刷新的這個請求到了伺服器端,這一次ABAP伺服器成功解析出請求欄位If-Modified-Since的值:

將客戶端發送過來的這個If-Modified-Since時間戳,同伺服器端該文件最後修改的時間戳進行比較(即下圖第26行AND後的第二個判斷條件),發現二者相等,因此在第28行返回HTTP 304 Not Modified.

第三種情況:HTTP 200(from Cache)

關掉Chrome,再打開,再訪問同一url,此時Chrome直接從自身的cache裡返回該JavaScript文件,而不是向ABAP伺服器上發起請求。因此伺服器上所有ABAP斷點均不會觸發。

再回到Jerry遇到的那個Azure上執行function創建API遇到的HTTP 400 Bad request的incident,至本文發稿時為止還是未能得到解決。

儘管Azure Function Host也是開源的,但不能調試,我拿著這些海量代碼也沒轍,目前Github上看到的就有多達967個開著的issue.

https://github.com/Azure/azure-functions-host/issues

從開發者遇到問題後調試定位這個角度上說,還是ABAP On-Premises方便啊。

感謝閱讀。

ABAP專題

Jerry的ABAP, Java和JavaScript亂燉ABAP開發人員未來應該學些什麼Jerry 2017年的五一小長假:8種經典排序算法的ABAP實現Jerry的ABAP原創技術文章合集300行ABAP代碼實現一個最簡單的區塊鏈原型使用Java+SAP雲平臺+SAP Cloud Connector調用ABAP On-Premise系統裡的函數在SAP雲平臺的CloudFoundry環境下消費ABAP On-Premise OData服務ABAP vs Java, 蛙泳 vs 自由式聊聊C語言和ABAP動手使用ABAP Channel開發一些小工具,提升日常工作效率我用ABAP做過的那些無聊的事情不喜歡SAP GUI?那試試用Eclipse進行ABAP開發吧使用Visual Studio Code編寫和激活ABAP代碼你的ABAP程序給佛祖開過光麼?來試試Jerry這個小技巧在SAP雲平臺ABAP編程環境上編寫第一段ABAP程序SAP官方發布的ABAP編程規範ABAP Code Inspector那些隱藏的功能,您都知道嗎?還在用ABAP進行SAP產品的二次開發?來了解下這種全新的二次開發理念吧ABAP Netweaver體內的那些寄生式程式語言從SAP社區上的一篇博客開始,聊聊SAP產品命名背後的那份情懷雲端的ABAP Restful服務開發如何在SAP雲平臺ABAP編程環境裡把CDS view暴露成OData服務使用abapGit在ABAP On-Premises系統和SAP雲平臺ABAP環境之間進行代碼傳輸30分鐘用Restful ABAP Programming模型開發一個支持增刪改查的Fiori應用Jerry帶您了解Restful ABAP Programming模型系列之二:Action和Validation的實現Jerry帶您了解Restful ABAP Programming模型系列之三:雲端ABAP應用調試SAP雲平臺上的ABAP編程環境裡如何消費第三方服務ABAP開發者上雲的時候到了 - 現在大家可以免費使用SAP雲平臺ABAP環境的試用版了學而不思則罔 - SAP雲平臺ABAP編程環境的由來和適用場景SAP雲平臺裡的三叉戟應用如何基於Restful ABAP Programming模型開發並部署一個支持增刪改查的Fiori應用SAP 2019 TechEd Key Note解讀:雲時代下SAP從業人員如何做二次開發?有哪些ABAP關鍵字和語法,到了ABAP雲環境上就沒辦法用了?ABAP開發環境終於支持以駝峰命名法自動格式化ABAP變量名了利用ABAP 740的新關鍵字REDUCE完成一個實際工作任務一段讓人瑟瑟發抖的ABAP代碼昨日萬聖節ABAP怪獸級代碼謎團,公布答案啦介紹一種在ABAP內核態進行內表高效拷貝的方法使用SAP Cloud Application Programming模型開發OData的一個實際例子當ABAP遇見普羅米修斯使用ABAP繪製可伸縮矢量圖ABAP開發環境語法高亮的那些事兒SAP錯誤消息調試之七種武器:讓所有的錯誤消息都能被定位使用ABAP操作Excel的幾種方法SAP GUI裡的收藏夾事務碼管理工具SAP GUI和Windows註冊表有了Debug權限就能幹壞事?小心了,你的一舉一動盡在系統監控中ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX這些東東是什麼鬼實現ABAP條件斷點的三種方式使用SAT跟蹤監控從瀏覽器打開的SAP應用的性能和調用棧一個13年ABAP老兵的建議:了解這些基礎知識,對ABAP開發有百利而無一害SAP ABAP Netweaver容器化, 不可能完成的任務嗎?SAP產品增強技術回顧SAP API開發方法大全淺談Java和SAP ABAP的靜態代理和動態代理,以及ABAP面向切面編程的嘗試

相關焦點

  • POST請求 報 HTTP status 415 錯誤(postman測試)
    POST請求中加入了headerheader中是否包含了正確的Content-Typehttp_status_unsupported_media (415)the server is refusing to service the request because the entity of the request
  • 筆記整理-ABAP示例程序
    RGRAPALL,SAP圖形應用示例, TCODE: GRAL9.運行系統命令:RSBDCOS0    對象列表查詢:RSWBO060    修改對象條目:RSWBO052    檢查SAP*和DDIC密碼:RSUSR003    傳輸文本至請求:RSTXTRAN    SAPscript輸入、輸出:RSTXSCRP    刪除舊abap的dumps:RSSNAPDL
  • 【螞蟻】HTTP 常見常用狀態碼並附實例展示
    當你在 B 站觀看視頻,打開開發者工具,會發現許多 206 狀態碼以及響應頭 Content-Range示例:http 轉向 https 時,有時會使用 301,此時瀏覽器會自動緩存,下次直接自動跳轉,不再請求伺服器。當更新域名需要 SEO 優化時,同樣使用 301 或者 308。
  • HTTP協議之狀態碼詳解
    什麼是HTTP狀態碼HTTP狀態碼的作用是:Web伺服器用來告訴客戶端,發生了什麼事。狀態碼位於HTTP Response 的第一行中,會返回一個」三位數字的狀態碼「和一個「狀態消息」。 」三位數字的狀態碼「便於程序進行處理, 「狀態消息」更便於人理解。如下圖, 當客戶端請求一個不存在的URL的時候, Web伺服器會返回 「HTTP/1.1 404 Not Found」 告訴瀏覽器客戶端。 伺服器無法找到所請求的URL。
  • HTTP狀態碼,你知道幾個??
    今天給大家分享之前小編面試過的一道面試題的答案,之前小編去面試,然後筆試是有一道寫出你所知道的http的狀態碼,但是真的只知道404.200.500
  • 一個13年ABAP老兵的建議:了解這些基礎知識,對ABAP開發有百利而無一害
    在Jerry之前的圖片推送中,我提到了SAP社區上這樣一篇博客:Proof of Concept: Deploying ABAP in Kuberneteshttps://blogs.sap.com/2020/02/06/proof-of-concept-deploying-abap-in-kubernetes
  • Jmeter之HTTP請求與響應
    一個http響應指的是從伺服器到客戶端的響應信息,它包括了以下信息:1.響應狀態碼:標記響應狀態,用來體現一個請求是否成功,例如200-成功,404:資源找不到,500-伺服器異常,302-重定向等等>2.響應頭:告訴客戶端關於伺服器,響應報文相關的一些信息,例如伺服器類型,響應報文格式等等3.響應報文:針對請求從伺服器響應回來的數據,例如xml,json,html等等.
  • SAP ABAP和Java裡的弱引用(WeakReference)和軟引用(SoftReference)
    CL_ABAP_WEAK_REFERENCE類的實例, 代表指向一個對象實例的弱應用。從字面上理解,既然存在弱引用,自然也存在其對立面的強應用。假設有一個ABAP類lcl_person:DATA: lo_person TYPE REF TO lcl_person.
  • 一次完整的HTTP請求與響應涉及哪些知識?
    圖片來自:理解Http請求與響應http://android.jobbole.com/85218/以上完整表示了HTTP請求和響應的7個步驟,下面從TCP/IP協議模型的角度來理解HTTP請求和響應如何傳遞的。
  • Nginx---高性能的HTTP和反向代理web伺服器
    #sendfile指令指定 nginx 是否調用sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,必須設為on。如果用來進行下載等應用磁碟IO重負載應用,可設置為off,以平衡磁碟與網絡IO處理速度,降低系統uptime。 sendfile on; #開啟目錄列表訪問,合適下載伺服器,默認關閉。
  • HTTP系列第1部分-基本概念概述
    ":422,"status":"misconfigured","message":"Invalid HTTP Response: 404"}},]響應消息的結構與請求相同,只是第一行稱為 狀態行,它令人驚訝,其中包含有關響應狀態的信息。
  • 應用層HTTP協議詳解 - 跟小智一起學網絡(5)
    這個時候,就該 HTTP 的狀態碼上場了。狀態碼,簡單理解就是瀏覽器客戶端和伺服器之間,定義的一個通用的有含義的代號。伺服器每次回應時,把這個代號帶上,瀏覽器就能很清楚的知道伺服器的響應狀態了。當然,為了讓大家很清晰的知道每個狀態的含義,每個狀態都有一個對應的簡短描述,我們叫它原因短語。HTTP 狀態碼由三位十進位數字組成,第一位表示狀態碼的類型。
  • 這些 HTTP 網頁狀態碼代表啥含義?
    404和HTTP狀態碼上面所說的404其實是一種標準的HTTP返回代碼,官方名稱是HTTP狀態碼(HTTP Status Code),用於表示網頁伺服器HTTP的響應狀態。在進行請求的時候,我們看到的都只是伺服器最後返回來的狀態碼,比如出錯的404和成功的200,但是實際上在請求的過程中,會有很多的狀態碼在快速變化,除非是類似打斷點的操作,一步操作停一下,否則是不能看出這些狀態碼是怎麼變化的,這就導致在伺服器響應過程中有很多狀態碼我們都看不到。
  • 問題回答:Http 請求的Post 和Put 的區別
    如果伺服器期望請求被應用於一個不同的URI,那麼它必須發送301(永久移動了)響應;用戶代理可以自己決定是否重定向請求。但之後RFC 2616在2014年被廢棄,改為 RFC 723X系列。例如,以下情況一般使用 Post 方法:服務端根據這些數據處理的實際結果來選擇一個Http響應狀態碼。除了206 (Partial Content), 304 (Not Modified), and 416 (Range Not Satisfiable) 這三個以外的 http響應狀態碼都可以作為 Post 請求的響應狀態碼。
  • HTTP 必知必會的那些
    Http報文首先我們來點基礎的,看看http報文具體的格式。http報文可以分為請求報文和響應報文,格式大同小異。這裡稍微解釋一下各個標籤:<method> 指請求方法,常用的主要是Get、 Post、Head 還有其他一些我們這裡就不說了,有興趣的可以自己查閱一下<version> 指協議版本,現在通常都是Http/1.1了<request-url> 請求地址<status> 指響應狀態碼, 我們熟悉的
  • 物聯網應用層協議選擇和分析--MQTT、CoAP 、HTTP、XMPP、SoAP
    主要是一對一的協議 舉個例子: 比如某個設備需要從伺服器端查詢當前溫度信息。 a.請求消息(CON): GET /temperature , 請求內容會被包在CON消息裡面 b.響應消息 (ACK): 2.05 Content 「22.5 C」 ,響應內容會被放在ACK消息裡面
  • 科普:404/401/408...這些HTTP網頁狀態碼代表啥含義? - IT之家
    今天我們就來談一談那些狀態碼。404和HTTP狀態碼上面所說的404其實是一種標準的HTTP返回代碼,官方名稱是HTTP狀態碼(HTTPStatusCode),用於表示網頁伺服器HTTP的響應狀態。但似乎一般人都不會仔細研究這些HTTP狀態碼和這些狀態碼對開發人員的影響。
  • SAP ABAP關鍵字語法圖和ABAP代碼自動生成工具Code Composer
    Jerry在做SAP CRM Fiori應用開發時,在學習JavaScript時,讀過這本書:書中使用這種語法圖講解JavaScript的語法:如果想生成全局ABAP類,即生成之後能夠持久化在ABAP伺服器上,並且能夠通過SE24和SE80打開,則將拼湊好的包含ABAP類實現原始碼的內表傳給ABAP類的創建API,即函數SEO_CLASS_CREATE_COMPLETE