使用 ABAP 代码消费 SAP 系统的 OData 服务

简介: 使用 ABAP 代码消费 SAP 系统的 OData 服务

源代码如下:

REPORT zget_book.

DATA:lo_http_client TYPE REF TO if_http_client,
     lv_status      TYPE i,
     lv_error       TYPE string,
     lv_message     TYPE string,
     lt_fields      TYPE tihttpnvp,
     lv_sysubrc     TYPE sysubrc,
     lt_cookie      TYPE tihttpcki,
     ls_cookie      LIKE LINE OF lt_cookie,
     lv_csrf_token  TYPE string.

CONSTANTS: host     TYPE string VALUE 'ldai2a.jerry.corp',
           port     TYPE string VALUE '44356',
           name     TYPE string VALUE 'YYYY',
           password TYPE string VALUE 'XXXX'.

CALL METHOD cl_http_client=>create_by_url
  EXPORTING
    url    = |https://{ host }:{ port }/sap/opu/odata/sap/ZBOOK_MANAGE_SRV/|
    ssl_id = 'ANONYM'
  IMPORTING
    client = lo_http_client
  EXCEPTIONS
    OTHERS = 1.

ASSERT sy-subrc = 0.

lo_http_client->authenticate( username = name password = password  ).

lo_http_client->request->set_header_field( name = 'x-csrf-token' value = 'fetch' ).

lo_http_client->propertytype_accept_cookie = if_http_client=>co_enabled.

CALL METHOD lo_http_client->send
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2
    http_processing_failed     = 3.

ASSERT sy-subrc = 0.

CALL METHOD lo_http_client->receive
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2
    http_processing_failed     = 3.

IF sy-subrc <> 0.
  CALL METHOD lo_http_client->get_last_error
    IMPORTING
      code    = lv_sysubrc
      message = lv_error.

  WRITE: / |error occurred during receive data: { lv_error } | COLOR COL_NEGATIVE.
  RETURN.
ENDIF.

lv_csrf_token = lo_http_client->response->get_header_field( name = 'x-csrf-token' ).
lo_http_client->response->get_cookies( CHANGING cookies = lt_cookie ).

CALL METHOD cl_http_client=>create_by_url
  EXPORTING
    url    = |https://{ host }:{ port }/sap/opu/odata/sap/ZBOOK_MANAGE_SRV/BookSet(guid'42010aee-2a94-1edd-8494-c9d14e91555e')|
    ssl_id = 'ANONYM'
  IMPORTING
    client = lo_http_client
  EXCEPTIONS
    OTHERS = 1.

ASSERT sy-subrc = 0.

CALL METHOD lo_http_client->request->set_method( 'PUT' ).

lo_http_client->request->set_header_field( name = 'Content-Type' value = 'application/json' ).

lo_http_client->authenticate( username = name password = password  ).

lo_http_client->request->set_header_field( name = 'x-csrf-token' value = lv_csrf_token ).

lo_http_client->request->set_cdata( data = `{"stock_number": 14}` ).

LOOP AT lt_cookie INTO ls_cookie.
  lo_http_client->request->set_cookie( name = ls_cookie-name value = ls_cookie-value ).
ENDLOOP.

CALL METHOD lo_http_client->send
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2
    http_processing_failed     = 3.

ASSERT sy-subrc = 0.

CALL METHOD lo_http_client->receive
  EXCEPTIONS
    http_communication_failure = 1
    http_invalid_state         = 2
    http_processing_failed     = 3.

IF sy-subrc <> 0.
  CALL METHOD lo_http_client->get_last_error
    IMPORTING
      code    = lv_sysubrc
      message = lv_error.

  WRITE: / |error occurred during receive data: { lv_error } | COLOR COL_NEGATIVE.
  RETURN.
ENDIF.

lo_http_client->response->get_status( IMPORTING code = lv_status ).

lv_message = lo_http_client->response->get_cdata( ).

要深入理解 if_http_client 在 SAP ABAP 开发中的作用与使用场景,首要的是认识到它作为一个接口在 SAP NetWeaver 技术栈中的定位。ABAP (Advanced Business Application Programming) 是 SAP 的编程语言,专门用于开发 SAP 应用。而 if_http_client 接口则是 ABAP 语言中用于处理 HTTP 请求的一种手段,它属于 SAP NetWeaver 应用服务器的一部分,更具体地说,是其内建的 HTTP 通信框架的一环。


if_http_client 提供了一系列的方法用于发送 HTTP 请求和接收响应。这包括了创建请求、设置请求头、发送 GET 或 POST 请求、接收和解析响应等功能。通过这个接口,ABAP 开发者可以构建出与外部系统交互的应用,例如调用外部的 RESTful API、处理 Web 服务请求等。


接下来,让我们通过实际的例子来展示 if_http_client 的使用方法和场景。


示例场景:调用 RESTful API 获取天气信息

假设我们需要在 SAP 系统中集成一个功能,该功能通过调用一个外部 RESTful API 来获取特定城市的天气信息。这个过程涉及到发送一个 HTTP GET 请求到 API,然后解析返回的 JSON 格式的响应数据。


创建 HTTP 客户端

要开始我们的任务,首先需要使用 cl_http_client 类的 create_by_url 方法创建一个 HTTP 客户端实例。这个方法需要传入目标 URL 作为参数:

DATA(lo_http_client) TYPE REF TO if_http_client.
TRY.
    cl_http_client=>create_by_url(
        EXPORTING
            url                = `http://api.weatherstack.com/current?access_key=您的API密钥&query=北京`
        RECEIVING
            client             = lo_http_client
        EXCEPTIONS
            argument_not_found = 1
            plugin_not_active  = 2
            internal_error     = 3
            OTHERS             = 4 ).
    IF sy-subrc <> 0.
        " 处理异常
    ENDIF.
CATCH cx_root INTO DATA(lx_exception).
    " 异常处理
ENDTRY.
发送请求并接收响应

创建客户端实例后,可以使用 send 方法发送请求,并通过 receive 方法接收响应:

TRY.
    lo_http_client->send( ).
    lo_http_client->receive( EXCEPTIONS http_communication_failure = 1 http_invalid_state = 2 ).
    IF sy-subrc <> 0.
        " 处理异常
    ENDIF.
CATCH cx_root INTO lx_exception.
    " 异常处理
ENDTRY.
解析 JSON 响应

一旦接收到响应,我们可以从 HTTP 客户端中获取响应正文,并使用 SAP 提供的 JSON 解析类(如 cl_trex_json_deserializer)解析 JSON 数据:

DATA(lv_json) TYPE string.
lo_http_client->response->get_cdata( IMPORTING data = lv_json ).

DATA(lo_json_reader) TYPE REF TO cl_trex_json_deserializer.
CREATE OBJECT lo_json_reader.

DATA(lv_weather_info) TYPE string.
TRY.
    lo_json_reader->deserialize( EXPORTING json = lv_json IMPORTING data = lv_weather_info ).
CATCH cx_root INTO lx_exception.
    " 异常处理
ENDTRY.

以上代码展示了如何使用 if_http_client 接口在 SAP ABAP 中发送 HTTP 请求、接收响应以及解析 JSON 数据。这只是 if_http_client 使用场景的一个示例,实际上,凭借这个强大的接口,ABAP 开发者可以实现多种与外部系统交互的需求,包括但不限于调用各类 Web 服务、处理 OAuth 认证、上传或下载文件等。这些功能的实现对于扩展 SAP 系统的能力,集成第三方服务和应用,提升企业运营效率具有重要意义。

相关文章
|
1月前
|
存储
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
|
1月前
|
安全 API 数据库
SAP ABAP OData 中 Function import 的概念介绍
SAP ABAP OData 中 Function import 的概念介绍
|
1月前
|
前端开发 数据库 开发者
如何在 SEGW 事务码里为 SAP ABAP OData 服务实现 Function Import 试读版
如何在 SEGW 事务码里为 SAP ABAP OData 服务实现 Function Import 试读版
SAP ABAP OData 服务里需要指定 guid 类型的请求参数时,正确语法是什么?
SAP ABAP OData 服务里需要指定 guid 类型的请求参数时,正确语法是什么?
|
1月前
|
机器学习/深度学习 人工智能 搜索推荐
SAP Commerce Cloud 智能销售服务 (Intelligent Selling Services)概述
SAP Commerce Cloud 智能销售服务 (Intelligent Selling Services)概述
|
1月前
|
前端开发 搜索推荐 开发者
SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
|
1月前
|
JavaScript 前端开发 开发者
SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍
SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍
|
1月前
|
Web App开发 数据采集 前端开发
纯技术讨论:如何让 SAP UI5 应用无法被别人在浏览器里调试 - 这种做法不推荐试读版
纯技术讨论:如何让 SAP UI5 应用无法被别人在浏览器里调试 - 这种做法不推荐试读版
|
1月前
|
XML 存储 数据格式
SAP UI5 控件 customData 属性的应用介绍
SAP UI5 控件 customData 属性的应用介绍
|
1月前
|
前端开发 JavaScript API
SAP UI5 sap.ui.require.toUrl 的作用介绍
SAP UI5 sap.ui.require.toUrl 的作用介绍