ABAP接口部分-Web Service提供者与消费者
Web Service提供者
Web Service
1、 创建Web Service:SE80
在包上,右击,点击“创建”—“企业服务”:
选择Service Provider,点击继续:
填写模块的名称:
如果没有函数模块,则创建一个:
事务代码:SE37
填写导入参数:
导出参数:
之后是:
点击完成:
点击保存:
点击确定:
点击激活按钮进行激活:
参数文件可以修改:
这个可以给外部第三方的开发人员调用:
测试
点击测试按钮进行测试:
点击“执行”:
执行结果:
修改成:
修改完成之后,点击这里:
点击"执行"按钮执行:
执行之后:
原本执行不成功,后面重新生成服务Z_WS002。
除了这种办法,还可以直接将函数发布成WebServices。
对Z_WS002同样进行SOA设置:
WSDL地址:http://mySAP.goodsap.***:50400/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/z_ws002/400/z_ws002/z_ws002?sap-client=400
配置
1、 配置:t-code:soamanager(由于服务器问题,这个方法暂时配置不了;)
在点击“配置”按钮进行配置:
发现进去报错了:
后面在自购的账号群公告中看到这个SOA登录网址:
SOA网址
https://mysap.goodsap.***:44300/sap/bc/webdynpro/sap/appl_soap_management
输入集团、用户和密码,点击登录:
点击“Web服务配置”:
这里填写我们刚刚创建的服务:
双击服务名称:
点击“创建服务”:
填写信息,点击“下一个”:
设置用户名和密码:
直接下一步->-下一步。
用户标识/密码如果无法选择,请把Web Service级别改为 NONE:
点击“打开WSDL生成”:
复制URL:
http://mysap.goodsap.***:50400/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/z_ws001/400/z_ws001/z_ws001?sap-client=400
RFC函数同步更新:
注意: 如果RFC 函数更新了,也需要到Web Service服务做“一致性检查”更新同步;
在服务上右击,点击“一致性检查”:
保存并激活:
测试
点击测试运行按钮进行测试:
结果:
Web Service消费者
事务代码:SE80:
创建Services Consumer消费者
选择:Service Consumer,点击“继续”:
选择“External WSDL/Schema”,点击“继续”:
选择“URL”:
输入URL地址:
输入用户名和密码:
点击,新建请求号,输入描述,点击确定:
选择好请求号:
输入请求号,输入前缀:
点击“完成”:
点击“保存”按钮进行保存:
保存并激活:
创建RFC连接
用事务代码 SM59 进入 RFC 连接配置:
事务代码:SM59
点击创建:
输入要创建的目标名称,选择连接类型:
输入描述,服务器提供者的域名和端口号,点击保存:
创建逻辑端口-IP地址
现在不使用LPCONFIG创建逻辑接口,而是在SOA网址上创建
使用在是外部ip地址和端口的情况,例如这种:
T-CODE: LPCONFIG
事务代码: LPCONFIG
输入事务代码之后,点击确定:
复制这个类的名称:
填写到这里:
如果是外部的ip地址端口,就可以使用下面的:
使用URL
如果是SAP WebSerivices创建的URL ,就填这个:
这里改了之后,还是报错。
这里要选中,否则激活会失败:
点击激活按钮进行激活:
返回接受者服务器运行测试:
输入逻辑接口:
可以点击这里,修改参数的名称:
可以这里返回执行界面:
点击“执行”按钮执行:
输入用户名和密码
报错
无法访问,是因为前面选择的是HTTP对象,RFC里面的WebServices_Test2,后面改成URL地址。
这个不是很清楚是怎么回事,后面查阅资料,重新再SOA中为WebServices消费者创建逻辑接口
创建逻辑端口-WebServices URL
现在使用这个创建逻辑端口
之前的逻辑端口没有什么效果,在这里重新创建逻辑端口,这个是基于之前在SAP系统中创建WebServices提供者时,暴露给外面的那个URL地址的。
进入SOA网址
进入SOA网址:
填写端口信息
填写逻辑端口的名称为ZWS_CO_Z_WS002_LHY,填写描述等信息:
填写WebServicesURL、用户名和密码:
点击“下一个”:
输入用户名和密码:
点击“完成”按钮:
填写好参数的值之后:
重新测试执行
点击执行:
点击执行之后,返回结果是3:
用自己创建的WebService
将在C#中创建的WebService服务弄到本机的IIS上
创建服务消费者
事务代码:SE80
1、点击创建企业服务
选择“Service Customer”,点击“继续”:
选择“External WSDL/Schma",点击”继续“:
选择URL:
输入URL,要在文件的后面加上?wsdl:
填写请求号,点击创建,输入描述:
填写请求号,和前缀:
点击“完成“按钮:
点击保存:
创建的企业服务如下:
保存并激活:
注意
创建RFC
用事务代码 SM59 进入 RFC 连接配置:
填写描述、主机和端口:
点击“连接测试”:
输入用户名和密码即可:
登录SOA网址
点击“Web服务配置”:
选择消费者代理,输入筛选条件,找到这个类名,双击:
点击创建,选择“基于WSDL的配置’':
填写信息,勾选缺省:
输入URL,输入用户名和密码,点击下一个:
点击下一个:
输入用户名和密码,点击下一个:
点击下一个:
一直点击下一个,直至完成:
逻辑端口创建成功:
测试服务消费者
返回接受者服务器运行测试:
输入逻辑端口名称和方法名称,点击执行:
可以点击这个按钮,修改xml的内容:
修改完毕之后,可以点击这个按钮返回:
点击执行:
返回结果,说明配置成功:
代码调用
创建程序
输入下面的代码:
*&---------------------------------------------------------------------*
*& Report ZTEST_WEB_SERVICE_CONSUMER
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_web_service_consumer.
DATA: lo_clientproxy TYPE REF TO zws_co_web_service1soap, "参考生成的代理类
lo_sys_exception TYPE REF TO cx_ai_system_fault.
DATA: ls_srm_input TYPE zws_age_soap_in,
ls_srm_input_response TYPE zws_age_soap_out.
* 2、调用webservice
CREATE OBJECT lo_clientproxy
EXPORTING
logical_port_name = 'ZWS_CO_WEB_SERVICE1SOAP'. "调用对应的逻辑端口
ls_srm_input-a1 = '22'.
ls_srm_input-a2 = '52'.
TRY.
CALL METHOD lo_clientproxy->age
EXPORTING
input = ls_srm_input
IMPORTING
output = ls_srm_input_response.
CATCH cx_ai_system_fault INTO lo_sys_exception."捕获错误
"CATCH zoa_cx_exception INTO lo_oa_exception.
ENDTRY.
"o_type = ls_srm_input_response-parameters-return-status.
"o_message = ls_srm_input_response-parameters-return-message.
"o_data = ls_srm_input_response-parameters-return-data.
WRITE: /,'WebService 测试:',ls_srm_input_response-age_result.
调用Web Service API
输入程序名,点击创建:
输入描述,选择可执行文件:
*&---------------------------------------------------------------------*
*& Report ZWEBSERVICE_TEST02
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZWEBSERVICE_TEST02.
data: len type i,"发送报文长度
len_string type string,
url type string, "接口地址
http_client type ref to if_http_client,"http客户端
post_string type string,
result type string.
DATA: LV_LEN TYPE I.
data: it_header type tihttpnvp.
data: gv_json_in TYPE string.
gv_json_in = '{"ApiType":"SapInterfaceController","Parameters":[{"Value":[{"Factory":"1100",'
&&'"FactoryName":"和胜","Center":"C001","CenterDesc":"工作中心001","Depart":"MES",'
&&'"DepartName":"MES项目组","Flag":"0"}]}],"Method":"SaveWorkCenter","Context":{"InvOrgId":1}}'.
START-OF-SELECTION.
url = 'http://192.168.4.32:1028/api/dataportal/invoke'.
"创建http客户端
call method cl_http_client=>create_by_url
exporting
url = url
importing
client = http_client
exceptions
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
others = 4.
"设定传输请求内容格式以及编码格式
http_client->REQUEST->SET_CONTENT_TYPE( CONTENT_TYPE = 'application/json; charset=utf-8' ).
"设置http method 为POST
http_client->request->set_method( if_http_request=>co_request_method_post ).
"设置待传输内容长度
LV_LEN = STRLEN( gv_json_in ).
"设置调用方法
CALL METHOD http_client->REQUEST->SET_HEADER_FIELD
EXPORTING
NAME = '~request_method'
VALUE = 'POST'.
"http_client->request->set_cdata( data = gv_json_in ).
"设置传入字符串
CALL METHOD http_client->REQUEST->SET_CDATA
EXPORTING
DATA = gv_json_in
OFFSET = 0
LENGTH = LV_LEN.
"发送数据
call method http_client->send
exceptions
http_***munication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
http_invalid_timeout = 4
others = 5.
"接收返回
call method http_client->receive
exceptions
http_***munication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
"获取接口返回的字符串
result = http_client->response->get_cdata( ).
WRITE: /,'测试数据',result.
后面这个本地文件不行
选择本地文件,因为本地的URL不成功:
选择文件:
在这里另存为下来的:
创建新的请求号,并填写描述:
填写内容之后,点击“继续”:
点击“完成”:
点击保存,并激活:
创建逻辑端口
为我们刚刚创建的消费者创建逻辑端口
登录SOA网址:https://mysap.goodsap.***:44300/sap/bc/webdynpro/sap/appl_soap_management
选择“Web服务配置”:
选择“消费者代理”,输入ZSW_*筛选条件,点击搜索,找到我们刚刚创建的消费者代理:
双击刚刚创建的“消费者代理”:
点击“创建”,选择“基于WSDL的配置”:
输入逻辑端口名称和描述,点击下一个:
选择文件,选中文件,点击下一个:
输入用户名和密码,点击下一个:
点击“下一个”:
点击“完成”:
测试服务消费者
点击执行测试:
输入逻辑端口名称,点击执行
选择方法,再次点击执行:
可以点击这里修改XML内容,改变参数的值:
修改参数的值,点击返回:
点击“执行”:
报错
点击执行之后,报下面的错误:
调用 SOAP 运行时函数时出错:SRT:Processing error in Inter*** ***munication Framework: (“Direct connect to 192.168.7.31:8080 failed: NIECONN_REFUSED(-10)”)
出现上面这个问题是因为,我自己的SAP服务器在外网,但是我访问的地址是内网地址,所以是访问不到的,所以失败了。
SRT Framework exception: 服务 Ping 错误:调用 SOAP 运行时函数时出错:SRT: Processing errorin Inter*** ***munication Framework: (“Direct connect to 192.168.7.31:8080 failed: NIECONN_REFUSED(-10)”)类型消息SRT Framework exception: 服务 Ping 错误:调用 SOAP 运行时函数时出错:SRT: Processing errorin Inter*** ***munication Framework: (“Direct connect to 192.168.7.31:8080 failed: NIECONN_REFUSED(-10)”)服务 Ping 错误:调用 SOAP 运行时函数时出错:SRT: Processing error in Inter*** ***munication Framework: (“Direct connect to 192.168.7.31:8080 failed: NIECONN_REFUSED(-10)”)处理 Web 服务调用时出错调用 SOAP 运行时函数时出错:SRT: Processing error in Inter*** ***munication Framework: (“Direct connect to 192.168.7.31:8080 failed: NIECONN_REFUSED(-10)”
Postman测试接口
首先用Postman测试接口是否配通
Headers设置
报错如下:
Body设置
选择raw,XML:
这里填成在浏览器测试时显示的请求格式:
点击Send发送,得到相应结果:
Direct connect to 192.168.7.31:8080 failed: NIECONN_REFUSED(-10)
这个问题没有解决。