什么是 Rest 动词和在 ABAP 中使用 REST 服务

举报
雨绸缪 发表于 2023/10/30 16:05:20 2023/10/30
【摘要】 罗伊·菲尔丁(Roy Fielding)创造了 Representational state transfer (REST 或 RESTful,表示状态转移)的名称。与公开功能的 SOAP 不同,REST 公开的是资源(数据)。REST Web 服务支持 JSON 和 XML 数据类型。性能,可扩展性,简单性,可移植性和可修改性是其余设计背后的主要原则。REST 是一种无状态,可缓存和简单的...

罗伊·菲尔丁(Roy Fielding)创造了 Representational state transfer (REST 或 RESTful,表示状态转移)的名称。与公开功能的 SOAP 不同,REST 公开的是资源(数据)。REST Web 服务支持 JSON 和 XML 数据类型。性能,可扩展性,简单性,可移植性和可修改性是其余设计背后的主要原则。REST 是一种无状态,可缓存和简单的体系结构,不是协议,而是模式。

REST 服务的中心原则是存在资源,每个资源都被一个唯一的资源标识符(URI)引用。这些资源的阅读和操作基于 HTTP 协议的标准化接口。通过 HTTP 协议,客户端和服务器交换和传输资源的表示,即传递资源信息的文档。

SAP 数据服务使您能够调用 REST 服务器,然后浏览和使用服务器返回的数据。REST Web 服务中的每个函数都使用唯一的端点统一资源标识符(URI)。每个函数都必须有一个由 XML 模式定义(XSD)定义的固定模式。基于 HTTP 动词,数据服务可以获取或修改资源。

REST 动词指定要对特定资源或资源集合执行的操作。当客户端发出请求时,它应该在 HTTP 请求中发送以下信息:

  • REST 动词

  • 头信息

  • 主体(可选)

REST 使用 URI 来解码其要处理的资源。有很多可用的 REST 动词,但其中有六个是经常使用的。比较常见的 HTTP 动词包括以下几种:

  • GET

  • POST

  • PUT

  • PATCH

  • DELETE

  • OPTIONS

如果您是软件开发人员,那么您大部分时间都会处理这六个问题。下表说明了操作、目标资源以及请求成功或失败时会发生什么:

上表的成功失败列中的数字是 HTTP 状态代码。每当客户端启动 REST 操作时,由于 REST 是无状态的,客户应该知道一种方法来找出该操作是否成功。因此,HTTP 设计出具有响应的状态代码。REST 定义给定操作的前一个状态代码类型。这意味着 REST API 应严格遵循前面的规则来实现客户端与服务器的通信。

所有定义的 REST 服务都具有以下格式。它由主机和 API 端点组成。 API 端点是服务器预定义的 URL 路径。每个 REST 请求都应该到达该路径。

REST API URI:http://HostName/API endpoint/Query(optional)

让我们更详细地查看所有动词。REST API 设计始于操作的定义和 API 端点。在实现 API 之前,设计文档应列出给定资源的所有端点。在以下部分中,我们仔细观察使用 PayPal 的 REST API 作为用例的 REST API 端点。

GET 方法

GET 方法从服务器获取给定的资源。为了指定一个资源,GET 使用了几种类型的 URI 查询:

  • 查询参数

  • 基于路径的参数

如果您不知道,您对网络的所有浏览都是通过对服务器执行 GET 请求来完成的。例如,如果您输入 www.google.com ,则实际上是获取获取搜索页面的 GET 请求。在这里,您的浏览器是客户端,Google 的 Web 服务器是 Web 服务的后端实现者。成功的 GET 操作返回 200 状态码。

路径参数的示例:

每个人都知道 PayPal。PayPal 与公司创建结算协议。如果您注册 PayPal 的支付系统,他们为您提供 REST API,以满足您的所有帐单需求。示例获取获取结算协议信息的请求如下所示:

/v1/payments/billing-agreements/agreement_id.

ABAP REST 库

ABAP REST 库特定的类位于包 SREST 及其子包(SREST_CORESREST_EXTSREST_HTTPSREST_TESTSREST_UTIL)中。如果你想使用 ABAPREST 库,你必须为相应的包接口声明一个访问用法。使用 ABAP REST 库,本博客的重点是在 HTTP 协议的上下文中开发 REST 服务,即 URI 模式是 httphttps ,授权机构标识 ABAP 应用服务器、SAP web 调度器或某个网络中间体(例如,反向代理,其被设置为将请求转发到ABAP应用服务器)。该路径由基本路径(在 ABAP Internet Communication Framework(ICF)中为 REST 服务的处理程序类定义)和资源路径组成,REST 应用程序服务使用该路径来标识所请求的资源。

ABAP REST 服务处理概述

这张图粗略地概述了在 ABAP 应用服务器中处理 REST 请求时的控制流。

startup2_208439.png

  1. ABAP 应用服务器上的任何传入 HTTP 请求都由 Internet 通信框架(ICF)处理。ICF 包含一个服务注册,其中注册了所有 ICF 相关服务及其处理程序类(通过事务 SCF 完成)。处理程序类是实现接口方法IF_HTTP_EXTENSION~HANDLE_REQUEST 的 ABAP 类。ABAP REST 服务也是如此,其中 ABAP 处理程序类是从类CL_REST_HTTP_HANDLER 派生的

  2. 在 HTTP 处理程序方法 HANDLE_REQUEST 中:

    • HTTP 请求对象和响应对象被对应的 REST 请求和响应对象包装,并且稍后可用于 REST 服务处理。
    • 创建一个包含一般信息(URI 部分、ICF 服务名称等)的 REST 上下文。为了在 REST 服务处理中可用
    • REST 应用程序被调用,该 REST 应用程序包含其具有标识符和处理类的可寻址资源列表
    • REST 路由器找到所使用 URL 的处理类
    • 应用程序访问资源的方法基于所使用的 HTTP 动词( GET,POST,PUT,DELETE,HEAD,OPTIONS)调用
  3. 在所标识的资源类和方法内部,进行数据处理

示例代码:

REPORT Z_TEST_API.

TYPES : BEGIN OF ls_data, " 数据结构
  vendorid TYPE string,
  vendorname TYPE string,
END OF ls_data,

BEGIN OF ls_api, " API 输出结构
  statuscode TYPE string,
  data TYPE TABLE OF ls_data,

END OF ls_api.

DATA : lw_response TYPE string, " 从 API 获取 JSON 响应

  ls_response TYPE ls_api, " ABAP Structure to catch converted API output/json data

  lo_client TYPE REF TO if_http_client. " HTTP Client Abstraction for API calling

" Creation of New IF_HTTP_Client Object
cl_http_client=>create_by_url(

  EXPORTING:
    url = ' http://abc.xyz.com/vendor/fetch' " Example URL — Replace with actual one
  IMPORTING:
    client = lo_client
  EXCEPTIONS:
    argument_not_found = 1
    plugin_not_active = 2
    internal_error = 3
).

IF sy-subrc = 0. " Handle error as per your requirement if sy-subrc fails
  lo_client->request->set_version( if_htttp_request=>co_protocol_version_1_1 ).
  
  " Setting Header data, for multiple header repeat with all header data set
  lo_client->request->set_header_field(
    EXPORTING:
      name = 'Content-Type'
      value = 'application/json' ).

  " Setting Body data
  lo_client->request->set_data(
    EXPORTING:
      data = '{“vendor”: [“1234”]}'.

  " Setting API call method
  lo_client->request->set_method( 'GET' ).

  " Check with URL send response
  lo_client-send(
    EXCEPTIONS:
      http_communication_failure = 1
      http_invalid_state = 2
      http_processing_failed = 3
      http_invalid_tiemout =4
  ).

  IF sy-subrc = 0. " Handle error as per your requirement if sy-subrc fails
    " Check with URL receive response

    lo_client->receive(
      EXCEPTIONS:
      http_communication_failure = 1
      http_invalid_state = 2
      http_processing_failed = 3
      http_invalid_tiemout =4
    ).

    IF sy-subrc = 0. " Handle error as per your requirement if sy-subrc fails
      " Fetch data from API in json format
      lw_response = lo_client->response->get_cdata( ).

      " Convert json data to SAP-ABAP structure
      zui_ci_json=>deserialize(
        EXPORTING
          json = lw_response
        CHANGING
          data = ls_response ).
    ENDIF.

  ENDIF.

ENDIF.
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。