LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

SAP 发布HTTP接口的Restful ( 含Token 验证)


2024年11月20日 16:42 本文热度 505

SAP 如何提供 Http Service

如果要将 SAP 应用程序服务器 (application server)作为 http 服务提供者,需要定义一个类,这个类必须实现 IF_HTTP_EXTENSION 接口。IF_HTTP_EXTENSION 接口只有一个方法 HANDLE_REQUEST。自定义的这个类必须实现 HANDLE_REQUEST 方法。HANDLE_REQUEST 方法的 SERVER 参数是一个 http server 对象 (类型为 ICF 框架的 IF_HTTP_SERVER 接口)。http server 对象具有的属性和方法对请求和响应进行处理。 然后使用 SICF 事务码创建服务,并且将处理器(handler)设定为自定义类。 客户端就可以访问这个服务。

REST

而是Resource Representational State Transfer的缩写:通俗来讲就是:资源在网络中以某种表现形式进行状态转移。分开来讲:

1.Resource:资源,即数据(网络的核心)。

2.Representational:某种表现形式,比如用JSON,XML,JPEG等;

3.State Transfer:状态变化。通过HTTP动词实现。

REST描述的是在网络中client和server的一种交互形式;REST本身不实用,实用的是如何设计 RESTful API(REST风格的网络接口;

Server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。“资源”是REST架构或者说整个网络处理的核心。

用HTTP协议里的动词来实现资源的添加,修改。

Server和Client之间传递某资源的一个表现形式,比如用JSON,XML传输文本,或者用JPG,WebP传输图片等。

用 HTTP Status Code传递Server的状态信息。比如最常用的 200 表示成功,500 表示Server内部错误等。

Web端不再用之前典型的PHP或JSP架构,而是改为前段渲染和附带处理简单的商务逻辑。Web端和Server只使用上述定义的API来传递数据和改变数据状态。格式一般是JSON。

对于资源的具体操作类型,由HTTP动词表示。常用的HTTP动词有下面五个(括号里是对应的SQL命令): 1.GET(SELECT): 从服务器获取资源(一项或多项) 2.POST(CREATE): 在服务器新建一个资源 3.PUT(UPDATE): 在服务器更新资源(客户端提供改变后的完整资源) 4.PATCHUPDATE): 在服务器更新资源(客户端提供改变的属性) 5.DELETEDELETE):从服务器删除资源。
比如: GET /zoos:列出所有动物园 POST /zoos:新建一个动物园 GET /zoos/ID:获取某个指定动物园的信息 PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息 PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息) DELETE /zoos/ID:删除某个动物园 GET /zoos/ID/animals:列出某个指定动物园的所有动物 DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

SAP 发布HTTP接口(RESTful方式)

一、代码过程

使用SE24创建一个类 ZLOCAL_CL_REST,并且继承超类 CL_REST_HTTP_HANDLER 。

重构方法 IF_REST_APPLICATION~GET_ROOT_HANDLERHANDLE_CSRF_TOKEN,其中HANDLE_CSRF_TOKEN 是用于token验证的,如果不需要token验证则直接重构即可,不需要代码,需要验证的话可以保留,无需重构。

重构的代码,其中/GET/PO 为接口路径,ZLOCAL_CL_GET_PURCHASEORDER 为接口类

  • TOKEN 验证 如果需要进行验证的,则不需要重构方法HANDLE_CSRF_TOKEN,在原有的代码逻辑下,使用GET 方法时,在发送请求时登入了 Authentication账号密码即可正确获取token。不需要token则直接重构即可,不需要代码。

  • 上述完成后,再次使用SE24 创建一个类,类名为前面的接口类 ZLOCAL_CL_GET_PURCHASEORDER.并且继承超类 CL_REST_RESOURCE

继承后,根据接口的不同调用方式,重构相应的方法

这里使用GET方式进行演示

  METHOD if_rest_resource~get.*CALL METHOD SUPER->IF_REST_RESOURCE~GET*    .    DATA: lv_output_json TYPE string.    DATA: lv_ebeln TYPE ebeln.    DATA: BEGIN OF ls_out,            ebeln TYPE ebeln,            bukrs TYPE bukrs,            bsart TYPE bsart,            aedat TYPE aedat,            ernam TYPE ernam,            lifnr TYPE lifnr,            ekorg TYPE ekorg,          END OF ls_out.    DATA: BEGIN OF ls_output,            code    TYPE char3,            clnt    TYPE sy-mandt,            status  TYPE char10,            content TYPE string,            data    LIKE ls_out,          END OF ls_output.          DATA(rt_parameters) =  mo_request->get_uri_query_parameters( )." 获取参数 "          LOOP AT rt_parameters ASSIGNING FIELD-SYMBOL(<fs_par>).      TRANSLATE <fs_par>-name TO UPPER CASE.      TRANSLATE <fs_par>-value TO UPPER CASE.    ENDLOOP.    ls_output-clnt = sy-mandt.    READ TABLE rt_parameters INTO DATA(ls_par) WITH KEY name = 'EBELN'.    IF sy-subrc IS INITIAL AND ls_par-value IS NOT INITIAL.      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'        EXPORTING          input  = ls_par-value        IMPORTING          output = lv_ebeln.      SELECT SINGLE * INTO CORRESPONDING FIELDS OF ls_out FROM ekko        WHERE ebeln = lv_ebeln.      IF sy-subrc IS INITIAL.        ls_output-data = ls_out.        ls_output-code = cl_rest_status_code=>gc_success_ok.        ls_output-status = 'success'.        ls_output-content = '获取成功'.      ELSE.        ls_output-data = ls_out.        ls_output-code = cl_rest_status_code=>gc_success_ok.        ls_output-status = 'fail'.        ls_output-content = '获取失败'.      ENDIF.    ELSE.      ls_output-data = ls_out.      ls_output-code = cl_rest_status_code=>gc_redirection_permanent.      ls_output-status = 'fail'.      ls_output-content = '参数错误'.    ENDIF.
   /ui2/cl_json=>serialize(   EXPORTING     data          = ls_output     compress      = abap_false     pretty_name   = /ui2/cl_json=>pretty_mode-camel_case   RECEIVING     r_json        = lv_output_json ).    " 响应内容"    mo_response->create_entity( )->set_string_data( lv_output_json ).    " 响应内容类型 : application/json"    mo_response->create_entity( )->set_content_type( iv_media_type = if_rest_media_type=>gc_appl_json ).    " 响应状态 : 非必须"    mo_response->set_status( cl_rest_status_code=>gc_success_ok ).    " 响应说明  : 非必须"    mo_response->set_reason( cl_rest_status_code=>get_reason_phrase( cl_rest_status_code=>gc_success_ok ) ).  ENDMETHOD.

POST方式获取body.

" POST 方式传入参数,JSON"    DATA(lv_input_json) = io_entity->get_string_data( ).

二、使用SICF配置服务

配置如下,处理器为 ZLOCAL_CL_REST ,即第一次创建的类。

三、Postman 测试

1、正确调用

如果路径不正确会提示没有合适的资源。

方法没启用,提示不受支持。

使用token

  1. 使用token 需要在 POST 方式调用,先对类ZLOCAL_CL_GET_PURCHASEORDER中的方法IF_REST_RESOURCE~POST 重构,为了测试这里简单重构了。

METHOD if_rest_resource~post.  TYPES:BEGIN OF ts_indata,          matnr TYPE matnr,          maktx TYPE maktx,        END OF ts_indata.  DATA: ls_data TYPE  ts_indata.  TYPES: BEGIN  OF ts_outdata,           code TYPE char3.      INCLUDE TYPE ts_indata.  TYPES:        END OF ts_outdata.  DATA: ls_outdata TYPE ts_outdata.  " POST 方式传入参数,JSON"  DATA(lv_input_json) = io_entity->get_string_data( ).
 " JSON 转换为内表"  /ui2/cl_json=>deserialize(    EXPORTING      json = lv_input_json    CHANGING        data = ls_data ).
 CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'    EXPORTING      input        = ls_data-matnr    IMPORTING      output       = ls_data-matnr    EXCEPTIONS      length_error = 1      OTHERS       = 2.
 SELECT SINGLE maktx FROM makt INTO ls_data-maktx WHERE matnr = ls_data-matnr.
 " 内表转换JSON"  DATA: lv_output_json TYPE string.
 MOVE-CORRESPONDING ls_data TO ls_outdata.
 ls_outdata-code = cl_rest_status_code=>gc_success_ok .
 /ui2/cl_json=>serialize(     EXPORTING       data          = ls_outdata       compress      = abap_false       pretty_name   = /ui2/cl_json=>pretty_mode-camel_case     RECEIVING       r_json        = lv_output_json ).
 " 响应内容"  mo_response->create_entity( )->set_string_data( lv_output_json ).  " 响应状态 : 非必须"  mo_response->set_status( cl_rest_status_code=>gc_success_ok ).  " 响应说明  : 非必须"  mo_response->set_reason( cl_rest_status_code=>get_reason_phrase( cl_rest_status_code=>gc_success_ok ) ).ENDMETHOD.

  • 对请求添加Basic Authentication账号密码,否则无法获取。

  • 使用Postman 获取token
    请求的Headers 中添加 x-csrf-token 参数,值为 fetch,即可在响应的 Headers 中取得 token 值。


测试token
1、使用错误的token会提示验证失败

正确的token,验证时同样需要Basic Authentication账号密码。(你也可以在sicf里面维护固定账号密码不推荐)


该文章在 2024/11/20 18:52:34 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved