SAP ABAP调用WEBAPI(一)

发布时间:2025-08-31 20:43:38 作者:益华网络 来源:undefined 浏览量(0) 点赞(0)
摘要:开始先介绍下json和xml的定义,网上找的信息,最后将用一个实例来讲解sap abap如何实现调用webapi. --------------

开始先介绍下json和xml的定义,网上找的信息,最后将用一个实例来讲解sap abap如何实现调用webapi.

-------------------------------------------------------------------------------------------------------

JSON 定义

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。简单地说,JSON 将数据转换为字符串,在终端之间传递。

数据在名称/值对中、数据由逗号分隔、花括号保存对象、方括号保存数组

JSON 值可以是:数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true 或 false)、数组(在方括号中)、对象(在花括号中)、null

例如:

{

    "name":"小强",

    "age":16,

    "msg":["a","b"],

    "regex": "^http://.*"

};

JSON 与XML的区别比较

1.定义介绍

(1).XML定义

扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。

XML是标准通用标记语言 (SGML) 的子集,非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

(2).JSON定义

JSON(JavaScript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。JSON采用兼容性很高的、完全独立于语言文本格式,同时也具备类似于C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)体系的行为。这些特性使JSON成为理想的数据交换语言。

JSON基于JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。

2.XML和JSON优缺点

(1).XML的优缺点

<1>.XML的优点

  A.格式统一,符合标准;

  B.容易与其他系统进行远程交互,数据共享比较方便。

<2>.XML的缺点

  A.XML文件庞大,文件格式复杂,传输占带宽;

  B.服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;

  C.客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;

  D.服务器端和客户端解析花费较多的资源和时间。

(2).JSON的优缺点

<1>.JSON的优点:

  A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;

  B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;

  C.支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;

  D.在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;

  E.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。

<2>.JSON的缺点

  A.没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;

  B.JSON格式目前在Web Service中推广还属于初级阶段。

3.XML和JSON的优缺点对比

(1).可读性方面。

JSON和XML的数据可读性基本相同,JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,XML可读性较好些。

(2).可扩展性方面。

XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。

(3).编码难度方面。

XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。

(4).解码难度方面。

XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。

(5).流行度方面。

XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。

(6).解析手段方面。

JSON和XML同样拥有丰富的解析手段。

(7).数据体积方面。

JSON相对于XML来讲,数据的体积小,传递的速度更快些。

(8).数据交互方面。

JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。

(9).数据描述方面。

JSON对数据的描述性比XML较差。

(10).传输速度方面。

JSON的速度要远远快于XML。

4.XML与JSON数据格式比较

(1).关于轻量级和重量级

轻量级和重量级是相对来说的,那么XML相对于JSON的重量级体现在哪呢?应该体现在解析上,XML目前设计了两种解析方式:DOM和 SAX。

<1>.DOM

DOM是把一个数据交换格式XML看成一个DOM对象,需要把XML文件整个读入内存,这一点上JSON和XML的原理是一样的,但是XML要考虑父节点和子节点,这一点上JSON的解析难度要小很多,因为JSON构建于两种结构:key/value,键值对的集合;值的有序集合,可理解为数组;

<2>.SAX

SAX不需要整个读入文档就可以对解析出的内容进行处理,是一种逐步解析的方法。程序也可以随时终止解析。这样,一个大的文档就可以逐步的、一点一点的展现出来,所以SAX适合于大规模的解析。这一点,JSON目前是做不到得。

所以,JSON和XML的轻/重量级的区别在于:

JSON只提供整体解析方案,而这种方法只在解析较少的数据时才能起到良好的效果;

XML提供了对大规模数据的逐步解析方案,这种方案很适合于对大量数据的处理。

(2).关于数据格式编码及解析难度

<1>.在编码方面。

虽然XML和JSON都有各自的编码工具,但是JSON的编码要比XML简单,即使不借助工具,也可以写出JSON代码,但要写出好的XML代码就有点困难;与XML一样,JSON也是基于文本的,且它们都使用Unicode编码,且其与数据交换格式XML一样具有可读性。

主观上来看,JSON更为清晰且冗余更少些。JSON网站提供了对JSON语法的严格描述,只是描述较简短。从总体来看,XML比较适合于标记文档,而JSON却更适于进行数据交换处理。

<2>.在解析方面。

在普通的web应用领域,开发者经常为XML的解析伤脑筋,无论是服务器端生成或处理XML,还是客户端用 JavaScript 解析XML,都常常导致复杂的代码,极低的开发效率。

实际上,对于大多数Web应用来说,他们根本不需要复杂的XML来传输数据,XML宣称的扩展性在此就很少具有优势,许多Ajax应用甚至直接返回HTML片段来构建动态Web页面。和返回XML并解析它相比,返回HTML片段大大降低了系统的复杂性,但同时缺少了一定的灵活性。同XML或 HTML片段相比,数据交换格式JSON 提供了更好的简单性和灵活性。在Web Serivice应用中,至少就目前来说XML仍有不可动摇的地位。

(3).实例比较

XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。

<1>.用XML表示中国部分省市数据如下:

复制代码

<?xml version="1.0" encoding="utf-8" ?>

<country>

  <name>中国</name>

  <province>

    <name>黑龙江</name>

    <citys>

      <city>哈尔滨</city>

      <city>大庆</city>

    </citys>    

  </province>

  <province>

    <name>广东</name>

    <citys>

      <city>广州</city>

      <city>深圳</city>

      <city>珠海</city>

    </citys>   

  </province>

  <province>

    <name>台湾</name>

    <citys>

       <city>台北</city>

       <city>高雄</city>

    </citys> 

  </province>

  <province>

    <name>新疆</name>

    <citys>

      <city>乌鲁木齐</city>

    </citys>

  </province>

</country>

复制代码

<2>.用JSON表示中国部分省市数据如下:

复制代码

 var country =

        {

            name: "中国",

            provinces: [

            { name: "黑龙江", citys: { city: ["哈尔滨", "大庆"]} },

            { name: "广东", citys: { city: ["广州", "深圳", "珠海"]} },

            { name: "台湾", citys: { city: ["台北", "高雄"]} },

            { name: "新疆", citys: { city: ["乌鲁木齐"]} }

            ]

        }

复制代码

编码的可读性来说,XML有明显的优势,毕竟人类的语言更贴近这样的说明结构。JSON读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读,所以通过JSON的索引country.provinces[0].name就能够读取“黑龙江”这个值。

编码的手写难度来说,XML还是舒服一些,好读当然就好写。不过写出来的字符JSON就明显少很多。去掉空白制表以及换行的话,JSON就是密密麻麻的有用数据,而XML却包含很多重复的标记字符。

以上内容转载于 https://www.cnblogs.com/SanMaoSpace/p/3139186.html

--------------------------------------------------------------------------------------------------

实际案例:

ABAP、WEBAPI、JSON的应用

业务背景:

调用webapi,输入员工号,返回员工信息。

代码实现:

1、编写webapi调用子程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<span style="font-size: 10px;">
*&---------------------------------------------------------------------*
<br>
*&      Form  frm_call_webapi
<br>
*&---------------------------------------------------------------------*
<br>
*       调用webapi
<br>
*----------------------------------------------------------------------*
<br>
*  -->  iv_json_input        输入json字符串
<br>
*  -->  iv_service_ur        服务地址(http://****)
<br>
*  <--  ev_json_output       输出json字符串
<br>
*----------------------------------------------------------------------*
<br>
FORM frm_call_webapi USING iv_json_input iv_service_url CHANGING ev_json_output.
<br>
DATA: lo_http_client TYPE REF TO if_http_client,
<br>
gv_json_out    TYPE string,
<br>
lv_url         TYPE string,
<br>
lv_len         TYPE i.
<br>
<br>
lv_url = iv_service_url.
<br>
<br>
"创建客户端请求
<br>
CALL METHOD cl_http_client=>create_by_url
<br>
EXPORTING
<br>
url                = lv_url
<br>
IMPORTING
<br>
client             = lo_http_client
<br>
EXCEPTIONS
<br>
argument_not_found = 1
<br>
plugin_not_active  = 2
<br>
internal_error     = 3
<br>
OTHERS             = 4.
<br>
IF sy-subrc <> 0.
<br>
"lv_subrc = sy-subrc.
<br>
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH
<br>
sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
<br>
EXIT.
<br>
ENDIF.
<br>
<br>
"设定传输请求内容格式以及编码格式
<br>
lo_http_client->request->set_content_type( content_type = application/json; charset=utf-8 ).
<br>
<br>
"设定调用服务
<br>
lo_http_client->request->set_method( if_http_request=>co_request_method_post ).
<br>
<br>
"设置待传输内容长度
<br>
lv_len = STRLEN( iv_json_input ).
<br>
<br>
"设置调用方法
<br>
CALL METHOD lo_http_client->request->set_header_field
<br>
EXPORTING
<br>
name  = ~request_method
<br>
value = POST.
<br>
"设置传入字符串
<br>
CALL METHOD lo_http_client->request->set_cdata
<br>
EXPORTING
<br>
data   = iv_json_input
<br>
offset = 0
<br>
length = lv_len.
<br>
"发送数据
<br>
lo_http_client->send(
<br>
EXCEPTIONS
<br>
http_communication_failure = 1
<br>
http_invalid_state         = 2 ).
<br>
"接收返回
<br>
lo_http_client->receive(
<br>
EXCEPTIONS
<br>
http_communication_failure = 1
<br>
http_invalid_state         = 2
<br>
http_processing_failed     = 3 ).
<br>
"提取返回字符串
<br>
ev_json_output = lo_http_client->response->get_cdata( ).
<br>
"将字符串中的回车符替换,否则abap将会识别为#
<br>
REPLACE ALL OCCURRENCES OF REGEX \n IN ev_json_output WITH space.
<br>
<br>
ENDFORM.                    "frm_call_webapi
</span>
<br>

2、调用子例程,传入参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<span style="font-size: 10px;">
REPORT yaiolos_test_05.
<br>
<br>
INCLUDE zbc_webapi_incl.
<br>
<br>
DATA : gv_service_url TYPE string VALUE http://10.100.0.232:8081/api_sapnew/ZRFM_HR_OA_GCQD_KH_MAINTAIN,
<br>
gv_json_in     TYPE string VALUE {"IT_INPUT":[{"CUSTOMER":"12345678","PERNR":"00190935"}]},
<br>
gv_json_out    TYPE string.
<br>
<br>
START-OF-SELECTION.
<br>
"调用webapi
<br>
PERFORM frm_call_webapi USING gv_json_in gv_service_url CHANGING gv_json_out.
<br>
<br>
END-OF-SELECTION.
<br>
WRITE gv_json_out.
<br>
</span>

yaiolos_test_05.txt

frm_call_webapi.txt

代码中有html标签不便于copy使用,请参见上述附件。

3、结果确认

 

注意事项:

abap中经常会将特殊字符识别为#,需要特别处理。

1、正则表达式解释及特殊字符如何对应正则表达式,请见以下链接

https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fr=aladdin

2、debug时遇见#字符而不知其实际内容时,查看十六进制值,如0A00等。十六进制和ASCII的对照关系,见以下链接

https://blog.csdn.net/wangzhyy/article/details/78720514

二维码

扫一扫,关注我们

声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

感兴趣吗?

欢迎联系我们,我们愿意为您解答任何有关网站疑难问题!

您身边的【网站建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,响应式网站,SEO优化,小程序开发,公众号系统,软件开发等

立即咨询 15368564009
在线客服
嘿,我来帮您!