matinal:SAP ABAP 发布HTTP RestFul服务全过程解析(四)

2023-11-12 08:31:45 浏览数 (1)

1、概念

1.1、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)设定为自定义类。 客户端就可以访问这个服务。

1.2、REST

此部分引用自:什么是REST,作者:IT修真院

而是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.PATCH(UPDATE): 在服务器更新资源(客户端提供改变的属性) 5.DELETE(DELETE):从服务器删除资源。

比如: 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:删除某个指定动物园的指定动物

2、工具

代码语言:javascript复制
SAP
SOAPUI 

3、创建接口

3.1、SE24接口类

激活,然后添加interface:IF_HTTP_EXTENSION并激活。IF_HTTP_EXTENSION是标准接口,固定填入即可,然后点击方法选项卡,双击第一行实现代码

3.2 实现接口

添加interface:IF_HTTP_EXTENSION,。IF_HTTP_EXTENSION是标准接口,固定填入即可,然后点击方法选项卡,双击第一行实现代码,然后激活。

类的内容如下:

代码语言:javascript复制
CLASS zcl_rest_mytest DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.

    INTERFACES if_http_extension .
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

* 公众号:matinal

CLASS ZCL_REST_MYTEST IMPLEMENTATION.


* <SIGNATURE>--------------------------------------------------------------------------------------- 
* | Instance Public Method ZCL_REST_MYTEST->IF_HTTP_EXTENSION~HANDLE_REQUEST
*  ------------------------------------------------------------------------------------------------- 
* | [--->] SERVER                         TYPE REF TO IF_HTTP_SERVER
*  --------------------------------------------------------------------------------------</SIGNATURE>
  METHOD if_http_extension~handle_request.
    DATA: lo_json_ser TYPE REF TO cl_trex_json_serializer,
          lo_json_des TYPE REF TO cl_trex_json_deserializer.
    DATA: json_string TYPE string.
    DATA:gt_t005u TYPE TABLE OF t005u.

    DATA: lv_input_json TYPE string .
    "获取传入的json 内容
    lv_input_json = server->request->if_http_entity~get_cdata( )."

    "设置返回数据格式
    CALL METHOD server->response->if_http_entity~set_content_type
      EXPORTING
        content_type = 'application/json'.
    "查询数据
    SELECT * INTO TABLE gt_t005u FROM t005u UP TO 20 ROWS WHERE spras = '1' AND land1 = 'CN'.

    "将数据转换为json格式
    CREATE OBJECT lo_json_ser
      EXPORTING
        data = gt_t005u[].

    "固定写法
    CALL METHOD lo_json_ser->serialize.

    "获得转换后数据并输出
    CALL METHOD lo_json_ser->get_data
      RECEIVING
        rval = json_string.
    server->response->set_cdata(
            EXPORTING
              data   = json_string    " Character data
          ).

  ENDMETHOD.
ENDCLASS.
3.3 SICF定义REST服务

使用事务码 SICF 在 default_host/sap 节点下面创建子节点,使用 Z_SIMPLE_REQ_HANDLER 类并激活方法。

这里选择新的子元素的方式创建

4、测试接口

4.1、输入测试地址
4.2、输入参数
4.3、断点调试

设置外部断点,然后执行POST

在sap中使用get_cdata()获得post传入的内容(json字符串),解析JSON后获得需要的参数。

SOAPUI中能够看到返回的json信息

0 人点赞