什么是 Rest 动词和在 ABAP 中使用 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_CORE
、SREST_EXT
、SREST_HTTP
、SREST_TEST
、SREST_UTIL
)中。如果你想使用 ABAPREST 库,你必须为相应的包接口声明一个访问用法。使用 ABAP REST 库,本博客的重点是在 HTTP 协议的上下文中开发 REST 服务,即 URI 模式是 http
或 https
,授权机构标识 ABAP 应用服务器、SAP web 调度器或某个网络中间体(例如,反向代理,其被设置为将请求转发到ABAP应用服务器)。该路径由基本路径(在 ABAP Internet Communication Framework(ICF)中为 REST 服务的处理程序类定义)和资源路径组成,REST 应用程序服务使用该路径来标识所请求的资源。
ABAP REST 服务处理概述
这张图粗略地概述了在 ABAP 应用服务器中处理 REST 请求时的控制流。
ABAP 应用服务器上的任何传入 HTTP 请求都由 Internet 通信框架(ICF)处理。ICF 包含一个服务注册,其中注册了所有 ICF 相关服务及其处理程序类(通过事务
SCF
完成)。处理程序类是实现接口方法IF_HTTP_EXTENSION~HANDLE_REQUEST
的 ABAP 类。ABAP REST 服务也是如此,其中 ABAP 处理程序类是从类CL_REST_HTTP_HANDLER
派生的在 HTTP 处理程序方法
HANDLE_REQUEST
中:- HTTP 请求对象和响应对象被对应的 REST 请求和响应对象包装,并且稍后可用于 REST 服务处理。
- 创建一个包含一般信息(URI 部分、ICF 服务名称等)的 REST 上下文。为了在 REST 服务处理中可用
- REST 应用程序被调用,该 REST 应用程序包含其具有标识符和处理类的可寻址资源列表
- REST 路由器找到所使用 URL 的处理类
- 应用程序访问资源的方法基于所使用的 HTTP 动词( GET,POST,PUT,DELETE,HEAD,OPTIONS)调用
在所标识的资源类和方法内部,进行数据处理
示例代码:
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.
- 点赞
- 收藏
- 关注作者
评论(0)