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, "返回参数
lv_json1 TYPE string, "获取传回值数据
lv_json2 TYPE string. "获取传回值数据
* 获取JSON抬头数据
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'.
* 获取数据
SELECT matnr maktx INTO CORRESPONDING FIELDS OF TABLE lt_data
FROM makt
UP TO 20 ROWS.
* 内表转换JSON
CALL METHOD /ui2/cl_json=>serialize
EXPORTING
data = lt_data
RECEIVING
r_json = lv_json.
* 将行数据JSON返回给调用端
server->response->set_cdata(
EXPORTING
data = lv_json
server->response->set_status( code = 200 reason = 'OK' ).
WHEN 'POST'.
* 获取JSON行数据
lv_json1 = server->request->if_http_entity~get_cdata( ).
* 解析json至内表方法1
/ui2/cl_json=>deserialize( EXPORTING json = lv_json1
CHANGING data = ls_data ).
IF NOT lv_json1 IS INITIAL.
* 获取数据
SELECT matnr maktx INTO CORRESPONDING FIELDS OF TABLE lt_data
FROM makt
UP TO 20 ROWS
where matnr = ls_data-matnr.
* 内表转换json
CALL METHOD /ui2/cl_json=>serialize
EXPORTING
data = lt_data
RECEIVING
r_json = lv_json.
* 将行数据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至内表方法1
/ui2/cl_json=>deserialize( EXPORTING json = lv_json2
CHANGING data = lt_data ).
IF NOT lv_json2 IS INITIAL.
* 将行数据JSON返回给调用端
server->response->set_cdata(
EXPORTING
data = 'SoapUi传参已收到'
ENDIF.
server->response->set_status( code = 200 reason = 'OK' ).
ENDCASE.
ENDMETHOD.
二、使用事务码
SICF
在
default_host/sap/bc
节点下面创建子节点,用
Z_HCX_HTTP
类并激活方法:
1、创建子元素:
文末附:上文步骤3提到的另一种写法。
1、手动再依次添加GET和POST方法,再依次选中,点击参数,添加
参数SERVER - 类型Importing - 键入方法Type Ref To - 关联类型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 = '请求方法不支持,请联系管理员!' ).
ENDCASE.
endmethod.
3、根据业务需求情况,选择GET或POST编写代码,以GET为例:
method GET.
TYPES:BEGIN OF TY_TAB,
AUFNR TYPE AFPO-AUFNR, "生产订单号
* 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, "总数量
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, " 可以用来区分具体对应的处理类
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参数,请检查' ).
RETURN.
ENDIF.
" 将JSON转换成内表
/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.
"补全生产订单号的前导0.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = GS_TAB-AUFNR
IMPORTING
OUTPUT = GS_TAB-AUFNR.
MODIFY GT_TAB FROM GS_TAB.
ENDLOOP.
* 获取打印数据
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.
* 内表转换JSON
CALL METHOD /UI2/CL_JSON=>SERIALIZE
EXPORTING
DATA = GT_OUT
RECEIVING
R_JSON = LV_JSON_OUT.
* 将行数据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"
注:未获取到数据
资源名称:
sap
abap
开发从入门到精通 内容简介: 《
SAP
ABAP
开发从入门到精通》以应用实例的形式,讲解了
SAP
ABAP
开发的相关知识点,详细介绍了
SAP
ABAP
开发者必须掌握的包与变更传输系统(CTS)、数据类型、数据库、模块化程序、内表、调试、
ABAP
数据字典、锁对象、检索帮助、FieldSymbol与数据引用、
SAP
内存与
ABAP
内存、报表程序、模块池程序、
ABAP
对象、面向对象A
资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
ABAP
Netweaver里的事务码
SICF
是Jerry做原型开发时非常喜欢
使用
的一个工具:但凡遇到需要把
ABAP
系统里的资源以服务的方式暴露出来的场景,Jerry都喜欢在
SICF
里创建一个服务节点然后把业务逻辑写进去。
采用
SICF
服务的方式暴露
ABAP
Netweaver上的资源,比选择OData或者Web Service的工作量要小很多,比较适合Jerry负责的一些开发周期短,需要迅速出...
原因分析:出现此问题原因是浏览器找不到要访问的地址,
找不到要访问的地址,有可能是服务器本身故障了或者网络链接的问题,但如果网络和服务器都正常的话,更大的可能是WEB服务器没有进行被DNS解析到。
解决办法:让服务器的host被DNS解析。查看服务器的hostname很简单,只.
FUNCTION ZOFSFM001.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(IS_HEAD) TYPE ZOFSS001
*" E.
In my opinion
ABAP
ICF handler and
Java
Servlet play the same role in enhancement which enables your web server with additional functionality.
This blog will not introduce how an ICF handler class in ...
Sap
API
该程序正在读取
SAP
API
。 此
API
从防火墙后面的
SAP
ECC系统公开ODATA。 需要一个天蓝色的AD帐户,一个
SAP
-id,包括访问
SAP
系统中技术角色的权限。
SAP
API
已在Azure
API
管理中注册。
1 修改下载FM时,文件夹 screens 和 dictionary 放在对应的FM里.
2 修复 FM里关联FM下载时,include 下载不全的问题.
3 修复在下载 从表生成的SM30维护视图FG时,include 下载不全的问题.
4 FM下载时,主程序文件名改为大写,此处只修改了下载到PC时的逻辑.
5 修改根据FG下载时,同一FG下的FM都放在同一FG的文件夹下.
5.1 在屏幕FG处增加控制选项check box[ Remove FM's floder in FG: ],当勾选后,
5.1.1 下载前删除重复的include文件
5.1.2 该FG下所有FM & include都放在FG根目录下,不再每个FM各建一个文件夹.
5.1.3 该FG只生成一个 global-fg_[fg-name].html文件.对应FM中的超链接 'Global
一些刚刚接触到
SAP
Webservice的开发者由于对
SAP
Netweaver组件的不熟悉,往往在
使用
事物码SOAMANAGER进行webservice配置的时候,发现无法正常启动SOAMANAGER,本文将对两种常见的报错进行分析和处理,希望对大家有所帮助。
1.“无法访问此页面”:错误代码INET_E_RESOURCE_NOT_FOUND
原因分析:出现此问题...
DATA: lo_
http
_client TYPE REF TO if_
http
_client,
lv_service TYPE string,
lv_result TYPE string,
lo_ixml TYPE REF TO if_ixml,
lo_streamfactory TYPE...
在
SAP
ABAP
中,我们可以
使用
一些技术来查看程序的内存
使用
情况。以下是一些常用的方法:
1.
使用
Memory Inspector工具:可以通过事务码`SP01`进入Memory Inspector工具。在该工具中,可以查看程序在执行过程中所
使用
的内存量,并能够监视内存泄漏情况。通过选择相应的对象和进程,可以获得更详细的内存
使用
情况。
2.
使用
ABAP
Runtime Analysis (SE30):通过事务码`SE30`进入
ABAP
Runtime Analysis工具。在该工具中,可以分析程序的执行时间、内存占用以及数据库访问情况等。通过选择相应的程序和用户,可以查看内存
使用
情况以及相关的统计信息。
3.
使用
ABAP
Memory Inspector (SAT):通过事务码`SAT`进入
ABAP
Memory Inspector工具。在该工具中,可以查看程序中已分配的内存块的大小和类型。可以选择相应的程序和层次结构,以获得更详细的内存
使用
情况。
4.
使用
工具代码:可以通过编写
ABAP
代码,并
使用
相应的函数模块来查看程序的内存
使用
情况。例如,
使用
`GET_MEMORY_USAGE`函数模块可以获取当前进程的内存
使用
情况。还可以
使用
`GET_GLOBAL_MEMORY_STATISTICS`函数模块来获取整个系统的内存统计信息。
通过
使用
上述方法,我们可以有效地监视和分析程序的内存
使用
情况,以便及时优化和调整程序,提高系统的性能和稳定性。