SAP RESTFUL接口方式發布SICF實現全路徑

其他相關資料帖可參考:

https://blog.csdn.net/woniu_maggie/article/details/146210752
https://blog.csdn.net/SAPmatinal/article/details/134349125
https://blog.csdn.net/weixin_44382089/article/details/128283417

【業務場景】

外部系統不想通過RFC (需要安裝SAP官網的組件DDL等架包才能支持SAP 遠程RFC的JDBC訪問,比較麻煩)和WEBSERIVE服務方式訪問接口,可通過restful接口方式訪問更方便

1.SE24新建CLASS類:?ZCL_QUERY_GDDH_DATA

激活,然后添加interface接口:IF_HTTP_EXTENSION并激活。

2.實現IF_HTTP_EXTENSION~HANDLE_REQUEST

擴展方法IF_HTTP_EXTENSION~HANDLE_REQUEST, 可以根據GET/POST請求方式處理,這個接口采用的是POST請求方式

部分參數可以放到URL上面參數傳入,若有TOKEN認證放在REQUEST請求的BODY里面以json方式傳入,這個跟對方協商好就行,注意信息安全要求。

POST參數設置

?if_http_extension~handle_request.方法中獲取接口的調用方式是GET?/?POST請求

METHOD?if_http_extension~handle_request.

??"調用的方法?GET?/?POST
??DATA(lv_method)?=?server->request->get_method(?).

??CASE?lv_method.
????WHEN?'GET'.
??????me->get(?server?).

????WHEN?'POST'.
??????me->post(?server?).

??ENDCASE.
ENDMETHOD.?

GET請求方式:?

? METHOD?get.
????TYPES:
??????BEGIN?OF?ty_input,
????????token?TYPE?string,
??????END?OF?ty_input.

????DATA:?BEGIN?OF?ls_result,
????????????data????TYPE?STANDARD?TABLE?OF?ty_input,
????????????msg?????TYPE?string,
????????????success?TYPE?string,
??????????END?OF?ls_result.

????DATA:?lt_fields???????TYPE?tihttpnvp,
??????????ls_fields???????TYPE?ihttpnvp,
??????????lv_header_query?TYPE?string,
??????????lv_data?????????TYPE?string,
??????????lv_html?????????TYPE?string,
??????????lv_body?????????TYPE?string,
??????????lv_token????????TYPE?string,
??????????lv_content_type?TYPE?string,
??????????lv_md5??????????TYPE?string,
??????????lv_algo?????????TYPE?string,
??????????ls_info?????????TYPE?zshr_pernr_info_gddh,
??????????lv_zphone???????TYPE?zphone,
??????????lv_icnum????????TYPE?psg_idnum.

????FIELD-SYMBOLS:?<fs_field>?LIKE?LINE?OF?lt_fields.

????"Json結構
????DATA:?BEGIN?OF?ls_request,
????????????datalist?TYPE?TABLE?OF?zshr_pernr_info_gddh,
??????????END?OF?ls_request.

????"傳輸結構
????DATA:?ls_itab?TYPE?zshr_pernr_info_gddh,
??????????lt_itab?TYPE?TABLE?OF?zshr_pernr_info_gddh.

????server->request->get_form_fields(?CHANGING?fields?=?lt_fields?).
????IF?lt_fields?IS?INITIAL.
??????server->response->set_status(?code?=?404?reason?=?'未查詢到傳入參數,請檢查'?).
????ENDIF.

????LOOP?AT?lt_fields?INTO?ls_fields.
??????TRANSLATE?ls_fields-name?TO?UPPER?CASE.
??????CASE?ls_fields-name.
????????WHEN?'ZPHONE'.
??????????lv_zphone?=?ls_fields-value.

????????WHEN?'ICNUM'.
??????????lv_icnum?=?ls_fields-value.
????????WHEN?OTHERS.
??????ENDCASE.
????ENDLOOP.

????IF?lv_zphone?IS?INITIAL.
??????server->response->set_status(?code?=?404?reason?=?'手機號碼必傳,請檢查'?).
????ENDIF.

????CALL?FUNCTION?'ZHRFM_USER_INFO_GDDH'
??????EXPORTING
????????iv_zphone?=?lv_zphone
????????iv_icnum??=?lv_icnum
??????IMPORTING
????????es_info???=?ls_info.

????server->response->set_cdata(
????????/ui2/cl_json=>serialize(?data????????=?ls_info
?????????????????????????????????compress????=?abap_true
?????????????????????????????????pretty_name?=?/ui2/cl_json=>pretty_mode-camel_case?)?).

????server->response->set_status(?code?=?200?reason?=?'OK'?).
????lv_content_type?=?'application/json'.
????server->response->set_content_type(?lv_content_type?).

??ENDMETHOD.

POST請求方式:

? METHOD?post.
????TYPES:
??????BEGIN?OF?ty_input,
????????token?TYPE?string,
??????END?OF?ty_input.

????DATA:?BEGIN?OF?ls_result,
????????????data????TYPE?STANDARD?TABLE?OF?ty_input,
????????????msg?????TYPE?string,
????????????success?TYPE?string,
??????????END?OF?ls_result.

????DATA:?lt_fields???????TYPE?tihttpnvp,
??????????ls_fields???????TYPE?ihttpnvp,
??????????lv_header_query?TYPE?string,
??????????lv_data?????????TYPE?string,
??????????lv_html?????????TYPE?string,
??????????lv_body?????????TYPE?string,
??????????lv_token????????TYPE?string,
??????????lv_content_type?TYPE?string,
??????????lv_md5??????????TYPE?string,
??????????lv_algo?????????TYPE?string,
??????????ls_info?????????TYPE?zshr_pernr_info_gddh,
??????????lv_zphone???????TYPE?zphone,
??????????lv_icnum????????TYPE?psg_idnum.

????FIELD-SYMBOLS:?<fs_field>?LIKE?LINE?OF?lt_fields.

????"Json結構
????DATA:?BEGIN?OF?ls_request,
????????????datalist?TYPE?TABLE?OF?zshr_pernr_info_gddh,
??????????END?OF?ls_request.

????"傳輸結構
????DATA:?ls_itab?TYPE?zshr_pernr_info_gddh,
??????????lt_itab?TYPE?TABLE?OF?zshr_pernr_info_gddh.

????"?get?HEADER?fields
????server->request->get_header_fields(?CHANGING?fields?=?lt_fields??).
????lv_data?=?server->request->if_http_entity~get_cdata(?).

????"獲取HTTP?Body
????lv_body?=?server->request->get_cdata(?).

????"對方采用了basis認證登錄方式
*lv_token?=?'7815696ecbf1c96f'.
**TOKEN加密認證
*????TRY.
*????????lv_algo?=?'MD5'.?????????"?MD5,?SHA1,?SHA256,?SHA384,?SHA512
*????????cl_abap_message_digest=>calculate_hash_for_char(?EXPORTING?if_algorithm?=?lv_algo
*???????????????????????????????????????????????????????????????????if_data??????=?lv_token
*?????????????????????????????????????????????????????????IMPORTING
*???????????????????????????????????????????????????????????????????ef_hashstring?=?lv_md5?).
*??????CATCH?cx_root?INTO?DATA(e_text).
*????ENDTRY.
*
*
*????"將Json轉換成內表
*????TRY.
*
*????????CALL?METHOD?/ui2/cl_json=>deserialize(
*??????????EXPORTING
*????????????json????????=?lv_body
*????????????pretty_name?=?/ui2/cl_json=>pretty_mode-camel_case
*??????????CHANGING
*????????????data????????=?ls_result?).

*
*????????IF?ls_result-data?IS?NOT?INITIAL.
*??????????READ?TABLE?ls_result-data?INTO?DATA(ls_data)?INDEX?1.
*??????????IF?sy-subrc?EQ?0.
*????????????IF?ls_data-token?NE?lv_md5.
*??????????????server->response->set_status(?code?=?400?reason?=?'Token?Authority?Check?failed'?).
*??????????????server->response->set_cdata(
*??????????????????????/ui2/cl_json=>serialize(?data????????=?ls_info
*???????????????????????????????????????????????compress????=?abap_true
*???????????????????????????????????????????????pretty_name?=?/ui2/cl_json=>pretty_mode-camel_case?)?).
*??????????????EXIT.
*????????????ENDIF.
*??????????ENDIF.
*????????ENDIF.
*
*??????CATCH?cx_sy_move_cast_error.
*??????CATCH?cx_root.
*????ENDTRY..

????"?Read?the?fields?table?and?look?for?name?"~query_string"?--?this?will?contain?the?URL?query
????READ?TABLE?lt_fields?ASSIGNING?<fs_field>?WITH?KEY?name?=?'~query_string'.
????IF?sy-subrc?EQ?0.
??????SPLIT?<fs_field>-value?AT?'&'?INTO?TABLE?DATA(lt_data).
??????DELETE?lt_data?INDEX?1.
??????LOOP?AT?lt_data?INTO?DATA(lw_data).
????????CASE?sy-tabix.
??????????WHEN?1.
????????????SPLIT?lw_data?AT?'='?INTO?DATA(lv_str1)?lv_zphone.
??????????WHEN?2.
????????????SPLIT?lw_data?AT?'='?INTO?DATA(lv_str2)?lv_icnum.
????????ENDCASE.
??????ENDLOOP.
????ENDIF.

????IF?lv_zphone?IS?INITIAL.
??????CONCATENATE?'{"message":?"Please?input?ZPHONE'
????????????????????????'as?query?parameter."}'
???????????????????INTO?lv_html?SEPARATED?BY?space.

*"?Output?to?HTML
??????server->response->set_cdata(
????????EXPORTING
??????????data???=?lv_html????"?Character?data
??????).
??????server->response->set_status(?code?=?400?reason?=?'Please?input?ZPHONE'?).
????ENDIF.

????CALL?FUNCTION?'ZHRFM_USER_INFO_GDDH'
??????EXPORTING
????????iv_zphone?=?lv_zphone
????????iv_icnum??=?lv_icnum
??????IMPORTING
????????es_info???=?ls_info.

????server->response->set_status(?code?=?200?reason?=?'OK'?).
????lv_content_type?=?'application/json'.

????"設置返回格式Json
????server->response->set_content_type(?'application/json'?).

????"返回Body數據
????server->response->set_cdata(
???/ui2/cl_json=>serialize(?data????????=?ls_info
????????????????????????????compress????=?abap_true
????????????????????????????pretty_name?=?/ui2/cl_json=>pretty_mode-camel_case?)?).


??ENDMETHOD.

3.事務代碼SICF定義REST服務,配置用戶密碼(需要認證可不配置),添加處理類

登錄認證方式

SU01新增后臺接口訪問用戶,用戶類型:S(服務)

?若對方采用默認的BASIC Auth權限認證登錄方式,提供接口訪問用戶密碼給用戶。

對請求添加Basic Authentication賬號密碼,否則無法獲取

對方訪問的時候會彈出用戶密碼登錄這是SAP認證方式,如何避免彈窗呢?

如果SICF服務配置了后臺訪問的用戶密碼,安全會話設置了不受限制,則不受彈窗。但是安全考慮還是需要對方采用basic auth認證訪問登錄,也可以再加token認證匹配雙層check。sicf此處用戶密碼不配置如果給外圍系統訪問的話。

SAP這邊默認是basic認證方式, 如果訪問方接口調用直接在對方那邊維護好咱們給的接口用戶就不會彈出來了?。當然你還可以用別的認證方式甚至免密登錄都可以。你可以試試postman然后維護好你的密碼就肯定不再需要認證了。

注意因為對方basis認證登錄所以sicf用戶密碼不配置,代碼中的TOKEN獲取MD5加密匹配驗證的邏輯可跟對方協商是否需要。

SICF發布服務名稱:ZRS_GDDH_DATA

處理器清單配置ZCL_QUERY_GDDH_DATA

保存激活.測試服務

SICF發布服務給對方的各個系統訪問地址,對方對各個環境訪問地址和端口等做防火墻網絡策略申請:各個環境訪問的域名或IP地址,及對應端口,還要用RFC方式還是HTTP方式訪問可能涉及到不同的端口訪問。以及生產環境主服務器(負載均衡),還是各個應用節點服務器訪問申請可以跟BASIS確認好。

最后使用SOUPUI 或者POSTMAN接口調用聯通測試

token驗證處理

token有放body的有放header的,取token再調業務接口的模式跟對方協商好就行。?

?token方式http處理,token放請求header中處理方式:

"拼接后續要使用的tken
? CONCATENATE 'Bearer' re_login-access_token INTO re_login-access_token SEPARATED BY space.
? lo_http_client->request->if_http_entity~set_content_type( content_type = 'application/json' ).
? lo_http_client->request->if_http_entity~set_header_field( name = 'Accept' value = 'application/json' ).
? lo_http_client->request->set_method( if_http_request=>co_request_method_post ).
?
?
? lo_http_client->request->if_http_entity~set_header_field( name ? = 'Authorization' value = re_login-access_token ).

token放在請求body中的處理方式如下:

簡單一點可以理解為,雙方約定用一個相同的accesskey訪問密鑰字符串(比如XXXX-2025),做MD5方式加密,對方JAVA端給這個值放入到請求頭. sap端對這個請求獲取JAVA傳入的請求頭屬性,然后也給“XXXX-2025”這個字符串加密,看跟JAVA傳入的請求頭里面的數據是否一致,一致就通過,否則就報錯

雙方約定好一個accesskey訪問密鑰字符串,用MD5加密,再從對方傳過來的請求BODY中獲取token是否匹配一致,加密后的值比對,一致就返回,否則就報錯。

*lv_token?=?'7815696ecbf1c96fuwuj2025'.
**加密
*????TRY.
*????????lv_algo?=?'MD5'.?????????"?MD5,?SHA1,?SHA256,?SHA384,?SHA512
*????????cl_abap_message_digest=>calculate_hash_for_char(?EXPORTING?if_algorithm?=?lv_algo
*???????????????????????????????????????????????????????????????????if_data??????=?lv_token
*?????????????????????????????????????????????????????????IMPORTING
*???????????????????????????????????????????????????????????????????ef_hashstring?=?lv_md5?).
*??????CATCH?cx_root?INTO?DATA(e_text).
*????ENDTRY.

*????"將Json轉換成內表
*????TRY.
*
*????????CALL?METHOD?/ui2/cl_json=>deserialize(
*??????????EXPORTING
*????????????json????????=?lv_body
*????????????pretty_name?=?/ui2/cl_json=>pretty_mode-camel_case
*??????????CHANGING
*????????????data????????=?ls_result?).
*
*????????IF?ls_result-data?IS?NOT?INITIAL.
*??????????READ?TABLE?ls_result-data?INTO?DATA(ls_data)?INDEX?1.
*??????????IF?sy-subrc?EQ?0.
*????????????IF?ls_data-token?NE?lv_md5.
*??????????????server->response->set_status(?code?=?400?reason?=?'Token?Authority?Check?failed'?).
*??????????????server->response->set_cdata(
*??????????????????????/ui2/cl_json=>serialize(?data????????=?ls_info
*???????????????????????????????????????????????compress????=?abap_true
*???????????????????????????????????????????????pretty_name?=?/ui2/cl_json=>pretty_mode-camel_case?)?).
*??????????????EXIT.
*????????????ENDIF.
*??????????ENDIF.
*????????ENDIF.
*
*??????CATCH?cx_sy_move_cast_error.
*??????CATCH?cx_root.
*????ENDTRY..

另外,關于登錄身份認證,JAVA等外圍系統有白名單的概念,就是有一些外部接口是不需要做登錄認證的,都是通過token的方式,比如簽名方式。一些外部接口就不需要走登錄認證。 比如有個接口要給非公司內部的系統調用,訪問用戶都沒有內部員工賬號,不能登錄公司統一的IDM/authing用戶單點登錄統一身份認證平臺。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84506.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84506.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84506.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在windows中安裝或卸載nginx

首先在nginx的安裝目錄下cmd查看nginx的版本&#xff1a; 在看windows的服務中是否nginx注冊為服務了 如果注冊了服務就先將服務卸載了 在nginx的安裝目錄cmd執行命令 NginxService.exe uninstall “NginxService”是對應的注冊的服務名稱 關閉所有的相關nginx的服務這個也…

FaceFusion 技術深度剖析:核心算法與實現機制揭秘

在 AI 換臉技術蓬勃發展的浪潮中&#xff0c;FaceFusion 憑借其出色的換臉效果和便捷的操作&#xff0c;成為眾多用戶的首選工具。從短視頻平臺上的創意惡搞視頻&#xff0c;到影視制作中的特效合成&#xff0c;FaceFusion 都展現出強大的實用性。而這一切的背后&#xff0c;是…

2. Web網絡基礎 - 協議端口

深入解析協議端口與netstat命令&#xff1a;網絡工程師的實戰指南 在網絡通信中&#xff0c;協議端口是服務訪問的門戶。本文將全面解析端口概念&#xff0c;并通過netstat命令實戰演示如何監控網絡連接狀態。 一、協議端口核心知識解析 1. 端口號的本質與分類 端口范圍類型說…

嵌入式學習筆記 - freeRTOS vTaskPlaceOnEventList()函數解析

vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); 函數第一個參數為消息隊列等待插入鏈表&#xff0c; void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) { configASSERT( pxEventList ); /…

Ubuntu 配置使用 zsh + 插件配置 + oh-my-zsh 美化過程

Ubuntu 配置使用 zsh 插件配置 oh-my-zsh 美化過程 引言zsh 安裝及基礎配置oh-my-zsh 安裝及美化配置oh-my-zsh 安裝主題美化配置主題自定義主題 插件安裝及配置官方插件查看及啟用插件安裝 主題文件備份.zshrcre5et_self.zsh-theme 同步發布在個人筆記Ubuntu 配置使用 zsh …

Xilinx FPGA 重構Multiboot ICAPE2和ICAPE3使用

一、FPGA Multiboot 本文主要介紹基于IPROG命令的FPGA多版本重構&#xff0c;用ICAP原語實現在線多版本切換。需要了解MultiBoot Fallback點擊鏈接。 如下圖所示&#xff0c;ICAP原語可實現flash中n1各版本的動態切換&#xff0c;在工作過程中&#xff0c;可以通過IPROG命令切…

springMVC-11 中文亂碼處理

前言 本文介紹了springMVC中文亂碼的解決方案&#xff0c;同時也貼出了本人遇到過的其他亂碼情況&#xff0c;可以根據自身情況選擇合適的解決方案。 其他-jdbc、前端、后端、jsp亂碼的解決 Tomcat導致的亂碼解決 自定義中文亂碼過濾器 老方法&#xff0c;通過javaW…

mysql-innoDB存儲引擎事務的原理

InnoDB 存儲引擎支持 ACID 事務&#xff0c;其事務機制是通過 Redo Log&#xff08;重做日志&#xff09;、Undo Log&#xff08;回滾日志&#xff09; 和 事務日志系統 來實現的。下面詳細解析 InnoDB 事務的工作原理。 1.事務的基本特性&#xff08;ACID&#xff09; 特性描…

在GIS 工作流中實現數據處理

通過將 ArcPy 應用于實際的 GIS 工作流&#xff0c;我們可以高效地完成數據處理任務&#xff0c;節省大量時間和精力。接下來&#xff0c;本文將結合具體案例&#xff0c;詳細介紹如何運用 ArcPy 實現 GIS 數據處理的全流程。 數據讀取與合并 假設我們有多個 shapefile 文件&a…

第十四屆藍橋杯_省賽B組(C).冶煉金屬

題目如下: 拿到題我們來看一下&#xff0c;題目的意思&#xff0c;就是求出N個記錄中的最大最小值&#xff0c;言外之意就是&#xff0c;如果超過了這個最大值不行&#xff0c;如果小于這個最小值也不行&#xff0c;所以我們得出&#xff0c;這道題是一個二分答案的題目&#x…

??Android 如何查看CPU架構?2025年主流架構有哪些??

在開發安卓應用或選購手機時&#xff0c;了解設備的CPU架構至關重要。不同的架構影響性能、兼容性和能效比。那么&#xff0c;??如何查看安卓設備的CPU架構&#xff1f;2025年主流架構有哪些&#xff1f;不同架構之間有什么區別&#xff1f;?? 本文將為你詳細解答。 ??1.…

飛算 JavaAI 2.0.0:開啟老項目迭代維護新時代

在軟件開發領域&#xff0c;老項目的迭代與維護一直是開發團隊面臨的難題。代碼邏輯混亂、技術棧陳舊、開發效率低下等問題&#xff0c;讓老項目改造猶如一場 “噩夢”。而飛算 JavaAI 2.0.0 版本的正式上線&#xff0c;通過三大核心能力升級&#xff0c;為老項目開發帶來了全新…

Linux初步介紹

Linux是一種開源的類Unix操作系統內核&#xff0c;廣泛應用于服務器、桌面、嵌入式設備等各種計算平臺。它由Linus Torvalds于1991年首次開發&#xff0c;因其穩定性、安全性和靈活性&#xff0c;被全球開發者和企業廣泛采用。 特點&#xff1a; 開放性&#xff08;開源&#…

OneNet + openssl + MQTT

1.OneNet 使用的教程 1.在網絡上搜索onenet&#xff0c;注冊并且登錄賬號。 2.產品服務-----物聯網服務平臺立即體驗 3.在底下找到立即體驗進去 4.產品開發------創建產品 5.關鍵是選擇MQTT&#xff0c;其他的內容自己填寫 6.這里產品以及開發完成&#xff0c;接下來就是添加設…

行為設計模式之Memento(備忘錄)

行為設計模式之Memento&#xff08;備忘錄&#xff09; 前言&#xff1a; 備忘錄設計模式&#xff0c;有點像vmware快照可以回滾&#xff0c;idea的提交記錄同樣可以混滾&#xff0c;流程引擎中流程可以撤銷到或者回滾到某個指定的狀態。 1&#xff09;意圖 在不破壞封裝性的…

動畫直播如何顛覆傳統?解析足球籃球賽事的數據可視化革命

在5G和AI技術快速發展的今天&#xff0c;體育賽事直播正在經歷一場深刻的變革。傳統視頻直播雖然能提供真實的比賽畫面&#xff0c;但在戰術可視化、數據深度和交互體驗方面存在明顯短板。而基于實時數據驅動的動畫直播技術&#xff0c;正通過創新的方式彌補這些不足&#xff0…

二刷蒼穹外賣 day01

nginx nginx反向代理 將前端發送的請求由nginx轉發到后端服務器 好處&#xff1a; 提速&#xff1a;nginx本身可緩存數據 負載均衡&#xff1a;配置多臺服務器&#xff0c;大量請求來臨可均衡分配 保證后端安全&#xff1a;不暴露后端服務真實地址 server{listen 80;server_…

5.2 HarmonyOS NEXT應用性能診斷與優化:工具鏈、啟動速度與功耗管理實戰

HarmonyOS NEXT應用性能診斷與優化&#xff1a;工具鏈、啟動速度與功耗管理實戰 在HarmonyOS NEXT的全場景生態中&#xff0c;應用性能直接影響用戶體驗。通過專業的性能分析工具鏈、針對性的啟動速度優化&#xff0c;以及精細化的功耗管理&#xff0c;開發者能夠構建"秒…

模型訓練-關于token【低概率token, 高熵token】

Qwen團隊新發現&#xff1a;大模型推理能力的提高僅由少數高熵 Token 貢獻 不要讓低概率token主導了LLM的強化學習過程 一 低概率詞元問題 論文&#xff1a;Do Not Let Low-Probability Tokens Over-Dominate in RL for LLMs 在RL訓練過程中&#xff0c;低概率詞元&#xff08…

XCTF-web-easyupload

試了試php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都沒有用 嘗試.user.ini 抓包修改將.user.ini修改為jpg圖片 在上傳一個123.jpg 用蟻劍連接&#xff0c;得到flag