头图

源代码如下:

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 系统的能力,集成第三方服务和应用,提升企业运营效率具有重要意义。


注销
1k 声望1.6k 粉丝

invalid


引用和评论

0 条评论