您现在的位置是:亿华云 > 热点
SAP ABAP调用WEBAPI(一)
亿华云2025-10-04 01:16:17【热点】5人已围观
简介开始先介绍下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
很赞哦!(84)
相关文章
- 只要我们做的是从目前的市场情况选择域名,从简单易记,从个性特征上,我们就可以找到一个好域名进行注册。域名注册进行域名记录和解析以及绑定网站后,客户可以通过URL登录您的网站。
- redis.conf配置事例
- 如何使用大数据管理工具来满足用户期望?
- 手把手教你用JavaScript打造一个网页搜索引擎
- 为什么现在中文域名觉得好?使用中文域名有什么好处?
- Spring Security 即将弃用配置类 WebSecurityConfigurerAdapter
- 在Ubuntu上安装开源数据库PostgreSQL 9.4
- 面板数据分析中标准误的估计修正
- 网站页面结构改版,仅是页面样式发生变化,不会对排名、收录有影响;只有涉及到页面URL改变,才会对网站排名、收录有影响。
- RTOS 应用程序开发人员面临的三个常见挑战
热门文章
站长推荐
公司在注册域名时还需要确保邮箱的安全性。如果邮箱不安全,它只会受到攻击。攻击者可以直接在邮箱中重置密码并攻击用户。因此,有必要注意邮箱的安全性。
实现一个Vue3版抖音滑动插件踩坑指南!
MySQL 的最佳索引攻略
SQLServer:《SQL必知必会》一书的读书笔记(一)
其次,一般域名注册有一个获取密码的按钮,域名注册商点击后会向您发送密码。在得到域名注册商发送的密码后,将其传输到域名服务提供商网站,然后输入密码,此时域名呈现申请状态。提交申请后,原注册人通常会向您发送一封电子邮件,询问您是否同意转让。此时,您只需点击同意转移按钮,域名注册商就可以成功转移。
如何在CentOS 7上安装Redis服务器
你好,我是一个线程
Spring系列:聊聊 @Scope 注解用法,你会了吗?