SAP ABAP應用伺服器的HTTP響應狀態碼(Status Code)
最近Jerry參與了SAP Commerce Cloud的標準開發,我們呼叫微軟雲平臺Azure上建立Lambda Function的 Restful API來建立Lambda Function:
在開發過程中發現該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 200和HTTP 304理論上的差異解析,網上一搜一大把:
本文我們從一個實際的例子出發,觀察ABAP伺服器分別是在何種情況下,返回HTTP 200和304這兩個狀態碼的,幫助大家加深理解。
分幾種情況進行討論。
- 第一種情況:HTTP 200 OK
- 第二種情況:HTTP 304 Not Modified
- 第三種情況:HTTP 200(from Cache)
首先進行第一輪測試。
將這種來自SAP UI5標準庫檔案的url貼上到瀏覽器裡訪問:
~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:
~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.
從開發者遇到問題後除錯定位這個角度上說,還是ABAP On-Premises方便啊。
感謝閱讀。
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":
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面向切面程式設計的嘗試
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2688377/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HTTP 響應狀態碼HTTP
- HTTP協議狀態碼詳解(HTTP Status Code)HTTP協議
- 最全的HTTP響應狀態碼列表:除了404,HTTP狀態碼還有啥?HTTP
- HTTP請求方法及響應狀態碼詳解HTTP
- HTTP協議響應狀態碼(301、302、303的區別)HTTP協議
- status 返回當前請求的http狀態碼HTTP
- python requests檢測響應狀態碼Python
- XMLHttpRequest readyState響應狀態XMLHTTP
- API 所有的響應狀態碼都是 200?API
- SAP掃盲系列之二:SAP ABAP應用伺服器的組成部分伺服器
- 使用 setResponseStatus 函式設定響應狀態碼函式
- 你需要了解的 HTTP Status CodeHTTP
- http請求頭與響應頭的應用HTTP
- SAP BSP應用有狀態和無狀態行為差異比較
- 使用 useState 管理響應式狀態
- HTTP 響應HTTP
- 使用 Prometheus 監控 SAP ABAP 應用程式Prometheus
- http 狀態碼HTTP
- http狀態碼HTTP
- SAP cross distribution chain status在Fiori應用中的draft handlingROSAIRaft
- Angular 裡 HTTP 請求和響應結構的攔截器(interceptors)在 SAP Spartacus 中的應用AngularHTTP
- HTTP狀態碼的理解HTTP
- 常用的HTTP狀態碼HTTP
- 最全的 http 狀態碼HTTP
- SAP ABAP Gateway 系統裡 HTTP 請求響應頭部欄位 DataServiceVersion 的可能取值範圍GatewayHTTP
- 本地開發好的 SAP Fiori Elements 應用,如何部署到 ABAP 伺服器上?伺服器
- HTTP狀態碼:415HTTP
- Http狀態碼整理HTTP
- 常見的HTTP狀態碼HTTP
- 面試常問有關響應狀態碼3XX面試
- HTTP&response響應&驗證碼&servletcontextHTTPServletContext
- Sanic Response HTTP 響應HTTP
- HTTP的請求與響應HTTP
- http狀態碼(搬運)HTTP
- HTTP狀態碼詳解HTTP
- HTTP方法及狀態碼HTTP
- SAP ABAP Gateway Client 的 ABAP 實現,重用 HTTP ConnectionGatewayclientHTTP
- 探索FSM (有限狀態機)應用