如何通过单个身份验证令牌连接到外部RESTful Web服务?

2020-08-27 02:54发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家们,

我有一个需求,我需要使用单令牌身份验证在SAP系统中使用外部RESTful Web服务。 我们将使用此Web服务来验证将在SAP系统中创建的地址。 URL是一个普通的https类型url。

基础团队已经在SM59中创建了一个连接,但是测试连接出现错误,因为那里没有维护用户名和密码(这是单个令牌Web服务)。

我正在使用以下代码在ABAP中使用Web服务:

数据:lo_http_client类型参考if_http_client,
       lo_rest_client类型参考cl_rest_http_client,
       lv_payload TYPE字符串,
       lv_response TYPE字符串,
       lv_http_reason TYPE字符串,
       lv_payload_x TYPE xstring,
       lv_http_code TYPE i,
       lo_response类型参考if_rest_entity。


 cl_http_client => create_by_url(
   出口
     url ='https://********'
   输入
     客户端= lo_http_client
   例外情况
     arguments_not_found = 1
     plugin_not_active = 2
     internal_error = 3
     其他= 4)。
 如果sy-subrc <> 0。
   返回。
 万一。

 ****使用基础团队创建的SM59连接时。

 ** cl_http_client => create_by_destination(
 **出口
 ** destination ='TEST'"逻辑目的地(在函数调用中指定)
 **进口
 ** client = lo_http_client" HTTP客户端抽象
 **例外情况
 ** arguments_not_found = 1
 ** destination_not_found = 2
 ** destination_no_authority = 3
 ** plugin_not_active = 4
 ** internal_error = 5
 **其他= 6
 **)。

 创建对象lo_rest_client
   出口
     io_http_client = lo_http_client。

 lo_http_client-> request-> set_version(if_http_request => co_protocol_version_1_0)。

 * CALL FUNCTION'SCMS_STRING_TO_XSTRING'
 *出口
 *文字= lv_payload
 *重要
 *缓冲区= lv_payload_x。
 *

 **在标头中传递令牌值
 呼叫方法lo_http_client-> request-> set_header_field
   出口
     名称="授权"
     值= lv_token_value。

 **在标头中传递内容类型值,这是必填字段
 呼叫方法lo_http_client-> request-> set_header_field
   出口
     名称="内容类型"
     值='application/json'。

 **在标头中传递Accept值,该标头是必填字段
 呼叫方法lo_http_client-> request-> set_header_field
   出口
     名称="接受"
     值='application/json'。

 lo_http_client-> request-> set_method('POST')。
 lo_http_client-> request-> set_content_type('application/json')。
 * lo_http_client-> request-> set_data(lv_payload_x)。
 lo_http_client-> propertytype_logon_popup = if_http_client => co_disabled。

 *发送请求
 lo_http_client->发送(
 例外情况
 http_communication_failure = 1
 http_invalid_state = 2)。


 *收到回复
 lo_http_client-> receive(
 例外情况
 http_communication_failure = 1
 http_invalid_state = 2
 http_processing_failed = 3)。


 如果sy-subrc EQ 0。
 万一。
 lv_response = lo_http_client-> response-> get_cdata()。


 *获取响应状态
 调用方法lo_http_client-> response-> get_status
   输入
     代码= lv_http_code
     原因= lv_http_reason。


 如果sy-subrc EQ 0。
 万一。

 

在上面的代码中,我在接收响应的同时在接收方法中收到异常http_communication_failure。 错误代码确定为404:连接被拒绝。 create_by_url和create_by_destination调用中均出现此错误。 但是此错误代码不是来自客户端为此Web服务提供的错误代码列表。

有人可以告诉上面使用SAP中的单个令牌RESTful Web服务的上述代码/方法是否正确? 如果不是,那么上面的代码出了什么问题/丢失了。 另外请评论一下如何测试基础团队创建的SM59连接,以了解它是否有效。 当前,由于未维护用户名/密码,测试连接抛出错误(不适用!)。

任何帮助将不胜感激。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家们,

我有一个需求,我需要使用单令牌身份验证在SAP系统中使用外部RESTful Web服务。 我们将使用此Web服务来验证将在SAP系统中创建的地址。 URL是一个普通的https类型url。

基础团队已经在SM59中创建了一个连接,但是测试连接出现错误,因为那里没有维护用户名和密码(这是单个令牌Web服务)。

我正在使用以下代码在ABAP中使用Web服务:

数据:lo_http_client类型参考if_http_client,
       lo_rest_client类型参考cl_rest_http_client,
       lv_payload TYPE字符串,
       lv_response TYPE字符串,
       lv_http_reason TYPE字符串,
       lv_payload_x TYPE xstring,
       lv_http_code TYPE i,
       lo_response类型参考if_rest_entity。


 cl_http_client => create_by_url(
   出口
     url ='https://********'
   输入
     客户端= lo_http_client
   例外情况
     arguments_not_found = 1
     plugin_not_active = 2
     internal_error = 3
     其他= 4)。
 如果sy-subrc <> 0。
   返回。
 万一。

 ****使用基础团队创建的SM59连接时。

 ** cl_http_client => create_by_destination(
 **出口
 ** destination ='TEST'"逻辑目的地(在函数调用中指定)
 **进口
 ** client = lo_http_client" HTTP客户端抽象
 **例外情况
 ** arguments_not_found = 1
 ** destination_not_found = 2
 ** destination_no_authority = 3
 ** plugin_not_active = 4
 ** internal_error = 5
 **其他= 6
 **)。

 创建对象lo_rest_client
   出口
     io_http_client = lo_http_client。

 lo_http_client-> request-> set_version(if_http_request => co_protocol_version_1_0)。

 * CALL FUNCTION'SCMS_STRING_TO_XSTRING'
 *出口
 *文字= lv_payload
 *重要
 *缓冲区= lv_payload_x。
 *

 **在标头中传递令牌值
 呼叫方法lo_http_client-> request-> set_header_field
   出口
     名称="授权"
     值= lv_token_value。

 **在标头中传递内容类型值,这是必填字段
 呼叫方法lo_http_client-> request-> set_header_field
   出口
     名称="内容类型"
     值='application/json'。

 **在标头中传递Accept值,该标头是必填字段
 呼叫方法lo_http_client-> request-> set_header_field
   出口
     名称="接受"
     值='application/json'。

 lo_http_client-> request-> set_method('POST')。
 lo_http_client-> request-> set_content_type('application/json')。
 * lo_http_client-> request-> set_data(lv_payload_x)。
 lo_http_client-> propertytype_logon_popup = if_http_client => co_disabled。

 *发送请求
 lo_http_client->发送(
 例外情况
 http_communication_failure = 1
 http_invalid_state = 2)。


 *收到回复
 lo_http_client-> receive(
 例外情况
 http_communication_failure = 1
 http_invalid_state = 2
 http_processing_failed = 3)。


 如果sy-subrc EQ 0。
 万一。
 lv_response = lo_http_client-> response-> get_cdata()。


 *获取响应状态
 调用方法lo_http_client-> response-> get_status
   输入
     代码= lv_http_code
     原因= lv_http_reason。


 如果sy-subrc EQ 0。
 万一。

 

在上面的代码中,我在接收响应的同时在接收方法中收到异常http_communication_failure。 错误代码确定为404:连接被拒绝。 create_by_url和create_by_destination调用中均出现此错误。 但是此错误代码不是来自客户端为此Web服务提供的错误代码列表。

有人可以告诉上面使用SAP中的单个令牌RESTful Web服务的上述代码/方法是否正确? 如果不是,那么上面的代码出了什么问题/丢失了。 另外请评论一下如何测试基础团队创建的SM59连接,以了解它是否有效。 当前,由于未维护用户名/密码,测试连接抛出错误(不适用!)。

任何帮助将不胜感激。

付费偷看设置
发送
1条回答
Aaron 3364
1楼-- · 2020-08-27 03:23

你好

您解决了问题吗?

一周热门 更多>