一、SE24創(chuàng)建類:Z_HCX_HTTP
1、創(chuàng)建類:
2、切換到接口(interface)頁簽,輸入IF_HTTP_EXTENSION ,回車。切換到方法(method)頁簽,雙擊IF_HTTP_EXTENSION~HANDLE_REQUEST進入代碼編輯界面。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-505725.html
3、在IF_HTTP_EXTENSION~HANDLE_REQUEST方法中編寫代碼:(注:文末附另一種寫法)
METHOD if_http_extension~handle_request.
DATA: BEGIN OF ls_data,
matnr TYPE matnr,
maktx TYPE maktx,
END OF ls_data.
DATA: lt_data LIKE TABLE OF ls_data.
DATA: lt_fields TYPE tihttpnvp.
FIELD-SYMBOLS: <fs_field> LIKE LINE OF lt_fields.
DATA: lv_method TYPE string. "獲取GET/POST方式
DATA: lv_json TYPE string, "返回參數(shù)
lv_json1 TYPE string, "獲取傳回值數(shù)據(jù)
lv_json2 TYPE string. "獲取傳回值數(shù)據(jù)
* 獲取JSON抬頭數(shù)據(jù)
server->request->get_header_fields(
CHANGING
fields = lt_fields
).
lv_method = server->request->get_header_field( name = '~request_method' )."獲取GET/POST方式
CALL METHOD server->response->if_http_entity~set_content_type
EXPORTING
content_type = 'application/json'.
CASE lv_method.
WHEN 'GET'.
* 獲取數(shù)據(jù)
SELECT matnr maktx INTO CORRESPONDING FIELDS OF TABLE lt_data
FROM makt
UP TO 20 ROWS.
* 內(nèi)表轉換JSON
CALL METHOD /ui2/cl_json=>serialize
EXPORTING
data = lt_data
RECEIVING
r_json = lv_json.
* 將行數(shù)據(jù)JSON返回給調用端
server->response->set_cdata(
EXPORTING
data = lv_json
).
server->response->set_status( code = 200 reason = 'OK' ).
WHEN 'POST'.
* 獲取JSON行數(shù)據(jù)
lv_json1 = server->request->if_http_entity~get_cdata( ).
* 解析json至內(nèi)表方法1
/ui2/cl_json=>deserialize( EXPORTING json = lv_json1
CHANGING data = ls_data ).
IF NOT lv_json1 IS INITIAL.
* 獲取數(shù)據(jù)
SELECT matnr maktx INTO CORRESPONDING FIELDS OF TABLE lt_data
FROM makt
UP TO 20 ROWS
where matnr = ls_data-matnr.
* 內(nèi)表轉換json
CALL METHOD /ui2/cl_json=>serialize
EXPORTING
data = lt_data
RECEIVING
r_json = lv_json.
* 將行數(shù)據(jù)JSON返回給調用端
server->response->set_cdata(
EXPORTING
data = lv_json
).
ENDIF.
LOOP AT lt_fields INTO DATA(ls_fields).
CASE ls_fields-name.
WHEN 'lt_data'.
lv_json2 = ls_fields-value.
ENDCASE.
ENDLOOP.
* 解析json至內(nèi)表方法1
/ui2/cl_json=>deserialize( EXPORTING json = lv_json2
CHANGING data = lt_data ).
IF NOT lv_json2 IS INITIAL.
* 將行數(shù)據(jù)JSON返回給調用端
server->response->set_cdata(
EXPORTING
data = 'SoapUi傳參已收到'
).
ENDIF.
server->response->set_status( code = 200 reason = 'OK' ).
ENDCASE.
ENDMETHOD.
二、使用事務碼?SICF?在?default_host/sap/bc?節(jié)點下面創(chuàng)建子節(jié)點,用?Z_HCX_HTTP?類并激活方法:?
1、創(chuàng)建子元素:
?
?之后點擊保存。
2、在default_host/sap中找到剛剛創(chuàng)建的子元素:Z_HCX_HTTP激活服務:
?3、獲取URL調用地址:
直接打開默認是GET請求:
?在Postman 中測試post請求:
在SoapUI 中測試post請求:
?
文末附:上文步驟3提到的另一種寫法。
1、手動再依次添加GET和POST方法,再依次選中,點擊參數(shù),添加參數(shù)SERVER - 類型Importing - 鍵入方法Type Ref To - 關聯(lián)類型IF_HTTP_SERVER
?2、雙擊IF_HTTP_EXTENSION~HANDLE_REQUEST編寫代碼
method IF_HTTP_EXTENSION~HANDLE_REQUEST.
DATA(LV_METHOD) = SERVER->REQUEST->GET_METHOD( )."查看調用方法GET OR POST
CASE LV_METHOD.
WHEN 'GET'.
ME->GET( SERVER ).
WHEN 'POST'.
ME->POST( SERVER ).
WHEN OTHERS.
"Sets current HTTP status code
SERVER->RESPONSE->SET_STATUS( CODE = 405 REASON = '請求方法不支持,請聯(lián)系管理員!' ).
ENDCASE.
endmethod.
3、根據(jù)業(yè)務需求情況,選擇GET或POST編寫代碼,以GET為例:?
method GET.
TYPES:BEGIN OF TY_TAB,
AUFNR TYPE AFPO-AUFNR, "生產(chǎn)訂單號
* WERKS TYPE MARC-WERKS, "工廠
* MATNR TYPE AFPO-MATNR, "物料號
END OF TY_TAB.
DATA:GT_TAB TYPE TABLE OF TY_TAB,
GS_TAB TYPE TY_TAB.
TYPES:BEGIN OF TY_OUT,
MATNR TYPE AFPO-MATNR, "物料號
LGORT TYPE AFPO-LGORT, "庫存地點
PSMNG TYPE AFPO-PSMNG, "總數(shù)量
END OF TY_OUT.
DATA:GT_OUT TYPE TABLE OF TY_OUT,
GS_OUT TYPE TY_OUT.
DATA:
BEGIN OF LS_REQUEST,
ACTION TYPE STRING, " 可以用來區(qū)分具體對應的處理類
DATA TYPE TABLE OF TY_TAB, " 表結構
END OF LS_REQUEST,
LV_JSON TYPE STRING,
LV_CONTENT_TYPE TYPE STRING,
LV_JSON_OUT TYPE STRING,
LT_RETURN TYPE STANDARD TABLE OF BAPIRETURN,
LS_RETURN TYPE BAPIRETURN.
" DELIVERS THE HTTP BODY OF THIS ENTITY AS CHARACTER DATA
LV_JSON = SERVER->REQUEST->GET_CDATA( ).
IF LV_JSON IS INITIAL.
SERVER->RESPONSE->SET_STATUS( CODE = 404 REASON = '未解析到BODY參數(shù),請檢查' ).
RETURN.
ENDIF.
" 將JSON轉換成內(nèi)表
/UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_JSON CHANGING DATA = LS_REQUEST ).
CASE LS_REQUEST-ACTION.
WHEN 'ZGETPRINT'.
WHEN OTHERS.
SERVER->RESPONSE->SET_STATUS( CODE = 404 REASON = '未解析到對應ACTION,請檢查' ).
RETURN.
ENDCASE.
IF LS_REQUEST-DATA IS NOT INITIAL.
GT_TAB = LS_REQUEST-DATA.
ENDIF.
LOOP AT GT_TAB INTO GS_TAB.
"補全生產(chǎn)訂單號的前導0.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = GS_TAB-AUFNR
IMPORTING
OUTPUT = GS_TAB-AUFNR.
MODIFY GT_TAB FROM GS_TAB.
ENDLOOP.
* 獲取打印數(shù)據(jù)
SELECT MATNR LGORT PSMNG INTO CORRESPONDING FIELDS OF TABLE GT_OUT
FROM AFPO FOR ALL ENTRIES IN GT_TAB
WHERE AUFNR = GT_TAB-AUFNR.
IF GT_OUT IS INITIAL.
SERVER->RESPONSE->SET_CDATA( /UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500, SAP API SELECT ERROR' ) ).
RETURN.
ENDIF.
LOOP AT GT_OUT INTO GS_OUT.
"去除物料號的前導0.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = GS_OUT-MATNR
IMPORTING
OUTPUT = GS_OUT-MATNR.
MODIFY GT_OUT FROM GS_OUT.
ENDLOOP.
* 內(nèi)表轉換JSON
CALL METHOD /UI2/CL_JSON=>SERIALIZE
EXPORTING
DATA = GT_OUT
RECEIVING
R_JSON = LV_JSON_OUT.
* 將行數(shù)據(jù)JSON返回給調用端
SERVER->RESPONSE->SET_CDATA(
EXPORTING
DATA = LV_JSON_OUT ).
endmethod.
4、請求示例
{
??"ACTION":?"ZGETPRINT",
??"DATA":?[
??????{
????????????"AUFNR":"1000003"
????????}
??]
}
5、響應示例???
A、[{"MATNR":"11000042","LGORT":"4071","PSMNG":1620.000}]
B、"CODE:500,?SAP?API?SELECT?ERROR" ?注:未獲取到數(shù)據(jù)文章來源:http://www.zghlxwxcb.cn/news/detail-505725.html
?
到了這里,關于SAP ABAP 使用SICF發(fā)布HTTP API接口的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!