REST API调用无效字符

2020-09-08 08:46发布

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

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


亲爱的社区,

如果能解决以下问题,我将不胜感激:

我正在尝试直接从Autodesk提供的ABAP中使用REST API,以自动创建订单。
如果我使用Postman之类的程序调用Web服务,则POST请求会成功通过。

问题:

从ABAP调用REST API时,收到一条与无效字符'='相关的奇怪错误消息,这是必需的,因为该调用包含HMACSHA256和Base64编码参数。

我在邮递员中的工作电话

ABAP中的错误响应:

ABAP代码:

我正在使用SM59目标(HTTP1.1)。

此外,我在公司内部方法(用于Web服务的z-helper类)中使用类" CL_HTTP_CLIENT"。
但是当我尝试使用默认值"香草/SAP"使用" CL_HTTP_CLIENT"时,我收到相同的错误。

请求必须具有方法" POST"和内容类型" application/json; charset = UTF-8"。

 IF createbyrfc ='X'。

     lv_destination ='Z_AUTODESK_STAGEING'。
     cl_http_client => create_by_destination(
       出口
         目的地= lv_destination
       输入
         客户= lo_client
       例外情况
         arguments_not_found = 1
         destination_not_found = 2
         destination_no_authority = 3
         plugin_not_active = 4
         internal_error = 5
         其他= 6
     )。
     lo_client-> propertytype_logon_popup = if_http_client => co_disabled。
   其他。  " .....

  lo_client-> request-> set_content_type(content_type)。
  lo_client-> request-> set_header_field(导出名称='〜request_method'值=方法)。

 LOOP AT标头INTO ls_val。
       lo_client-> request-> set_header_field(name = ls_val-value value = ls_val-text)。
 结局。

 lo_client->发送(
     出口
       超时=超时
     例外情况
       http_communication_failure = 1
       http_invalid_state = 2
       http_processing_failed = 3
       其他= 4)。

   lo_client-> receive(
     例外情况
       http_communication_failure = 1
       http_invalid_state = 2
       http_processing_failed = 3
       其他= 4)。

   result-body = lo_client-> response-> get_cdata()。
   lo_client->响应-> get_status(导入代码= lv_status原因=结果原因)。
   结果状态= lv_状态。

   案例lv_status。
     时200。
       result-statust ="确定"。
     "什么时候 ...
   结束。

   lo_client-> close()。
 

创建错误的值是这样创建的:

清除ls_headers。
 ls_headers-text ='签名'。
 DATA(lv_signature_raw)= lv_callbackurl && lv_client_id && lv_time_utc。
 DATA(lv_binary_secret)= cl_abap_hmac => string_to_xstring(lv_client_secret)。

 cl_abap_hmac => calculate_hmac_for_char(
   出口
     if_algorithm ='SHA256'"哈希算法
     if_key = lv_binary_secret" HMAC密钥
     if_data = lv_signature_raw"数据
   输入
     ef_hmacb64string = lv_signature_final" HMAC值作为base64编码的字符串
 )。

 ls_headers-value = lv_signature_final。
 将ls_headers附加到lt_headers。

该值本身是正确的,因为它在邮递员中工作,但是某些内容不接受格式/'='字符。
起初,我对另一个包含空格的参数具有相同的含义,但是我能够"解决 "(或很有可能)通过使用不易碎的空格符号...

非常感谢您的帮助!
如果我忘记了一些东西,很抱歉,第一次来这里...

您真诚的,
帕特里克

(21.7 kB)

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

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


亲爱的社区,

如果能解决以下问题,我将不胜感激:

我正在尝试直接从Autodesk提供的ABAP中使用REST API,以自动创建订单。
如果我使用Postman之类的程序调用Web服务,则POST请求会成功通过。

问题:

从ABAP调用REST API时,收到一条与无效字符'='相关的奇怪错误消息,这是必需的,因为该调用包含HMACSHA256和Base64编码参数。

我在邮递员中的工作电话

ABAP中的错误响应:

ABAP代码:

我正在使用SM59目标(HTTP1.1)。

此外,我在公司内部方法(用于Web服务的z-helper类)中使用类" CL_HTTP_CLIENT"。
但是当我尝试使用默认值"香草/SAP"使用" CL_HTTP_CLIENT"时,我收到相同的错误。

请求必须具有方法" POST"和内容类型" application/json; charset = UTF-8"。

 IF createbyrfc ='X'。

     lv_destination ='Z_AUTODESK_STAGEING'。
     cl_http_client => create_by_destination(
       出口
         目的地= lv_destination
       输入
         客户= lo_client
       例外情况
         arguments_not_found = 1
         destination_not_found = 2
         destination_no_authority = 3
         plugin_not_active = 4
         internal_error = 5
         其他= 6
     )。
     lo_client-> propertytype_logon_popup = if_http_client => co_disabled。
   其他。  " .....

  lo_client-> request-> set_content_type(content_type)。
  lo_client-> request-> set_header_field(导出名称='〜request_method'值=方法)。

 LOOP AT标头INTO ls_val。
       lo_client-> request-> set_header_field(name = ls_val-value value = ls_val-text)。
 结局。

 lo_client->发送(
     出口
       超时=超时
     例外情况
       http_communication_failure = 1
       http_invalid_state = 2
       http_processing_failed = 3
       其他= 4)。

   lo_client-> receive(
     例外情况
       http_communication_failure = 1
       http_invalid_state = 2
       http_processing_failed = 3
       其他= 4)。

   result-body = lo_client-> response-> get_cdata()。
   lo_client->响应-> get_status(导入代码= lv_status原因=结果原因)。
   结果状态= lv_状态。

   案例lv_status。
     时200。
       result-statust ="确定"。
     "什么时候 ...
   结束。

   lo_client-> close()。
 

创建错误的值是这样创建的:

清除ls_headers。
 ls_headers-text ='签名'。
 DATA(lv_signature_raw)= lv_callbackurl && lv_client_id && lv_time_utc。
 DATA(lv_binary_secret)= cl_abap_hmac => string_to_xstring(lv_client_secret)。

 cl_abap_hmac => calculate_hmac_for_char(
   出口
     if_algorithm ='SHA256'"哈希算法
     if_key = lv_binary_secret" HMAC密钥
     if_data = lv_signature_raw"数据
   输入
     ef_hmacb64string = lv_signature_final" HMAC值作为base64编码的字符串
 )。

 ls_headers-value = lv_signature_final。
 将ls_headers附加到lt_headers。

该值本身是正确的,因为它在邮递员中工作,但是某些内容不接受格式/'='字符。
起初,我对另一个包含空格的参数具有相同的含义,但是我能够"解决 "(或很有可能)通过使用不易碎的空格符号...

非常感谢您的帮助!
如果我忘记了一些东西,很抱歉,第一次来这里...

您真诚的,
帕特里克

(21.7 kB)
付费偷看设置
发送
6条回答
四川大学会员
1楼-- · 2020-09-08 09:18

嗨,帕特里克,

我认为问题出在Base64特殊字符集,您应该先将特殊字符转换为ASCII,然后再将其传递给身份验证。 您可以使用SAP实用程序 https://answers.sap.com/ Questions/1267912/encode-and-decode-base64.html

请告诉我它是否适合您。

此致

Dhirendra Pandit

Doze时光
2楼-- · 2020-09-08 09:10

您说您需要在base64中签名,但是您的代码不会尝试将签名编码为base64,可以详细说明吗?

昵称总是被占用
3楼-- · 2020-09-08 09:34
< p>一些想法:

  • 您的系统是Unicode吗?
  • 您可以并排比较整个签名吗? 从Postman vs. SAP。 它们的长度是否完全相同(没有空格)?
  • 还要查看两个字符串的" ="字符的十六进制值。
  • 我还建议尝试使用BASE64验证程序,例如 https://base64.guru/tools/validator
  • 另一种可能值得尝试的想法是逃避整个" 签名" http字段,但在http标头字段中似乎允许使用字符" =",邮递员也不能转义...
木偶小白
4楼-- · 2020-09-08 09:16

Sandra Rossi

签名和标头值在Autodesk确认的情况下是正确的。
使用的方法" cl_abap_hmac => calculate_hmac_for_char"返回正确的base64签名。

我们的问题是Web服务调用中不接受某些字符作为" ="符号或空格。 BR

悠然的二货
5楼-- · 2020-09-08 09:28

嗨Dhirendra

谢谢您的回答。
不幸的是,您提出的解决方案不起作用,因为当使用解码的(cl_http_utility => decode_base64)值调用Autodesk Web服务时,它会显示一条一般错误400消息。

亲切的问候,
Patrick Baschera

绿领巾童鞋
6楼-- · 2020-09-08 09:08

嗨,托马斯

谢谢您的想法。

是的,我们的系统确实是unicode。 签名是相同的。 如果我将其从SAP复制到Postman,则该调用已在Postman中成功执行,但由于" ="符号,因此在SAP中引发了错误。

亲切的问候,
帕特里克

一周热门 更多>