更改目的地的路径前缀

时间:2018-11-12 13:38:47

标签: sap abap

我有一个由某些程序自动创建的目的地。

现在,我想在运行时以编程方式更改目标的路径前缀。这可能吗?

我正在浏览本文档

https://help.sap.com/saphelp_nw70/helpdata/en/1f/93163f9959a808e10000000a114084/content.htm?no_cache=true

这提到如果未提及路径前缀,则可以更改uri。所以我有一个没有路径前缀的目的地,然后尝试使用“ if_http_utility〜set_request_uri”方法,但这也没有用。

附加了代码示例

    *&---------------------------------------------------------------------*
*& Report http_destination_program
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT http_destination_program.

DATA client type ref to if_http_client.
DATA cl_http_util type ref to cl_http_utility.
DATA dest type rfcdest.
DATA gv_subrc  TYPE sysubrc.
DATA uri type string.
DATA timeout type I.
DATA errortext type string.

uri = '/do/b/json'.
DEST = 'SAP'.
errortext = ' Cannot connect to server'.
timeout = 0.

CALL METHOD cl_http_client=>create_by_destination

  exporting destination = dest

  importing client      = client

exceptions

        destination_not_found    = 1

        internal_error           = 2

         argument_not_found = 3

        destination_no_authority = 4

         plugin_not_active  = 5

        others                   = 6.

   cl_http_utility=>set_request_uri( request = client->request
   uri = uri ).



   gv_subrc = sy-subrc.
  gv_subrc = cl_http_utility=>get_last_error( ).
  IF gv_subrc <> 0.
    WRITE: / 'Wrong URI format'.
    EXIT.
  ENDIF.
  write 'Hello Saurav'.


  call method client->send

  exporting  timeout = timeout

  exceptions http_communication_failure  = 1

             http_invalid_state          = 2

             http_processing_failed      = 3

             others                      = 4.

if sy-subrc <> 0.

  call method client->get_last_error

     importing code    = gv_subrc

               message = errortext.

   write: / 'communication_error( send )',

         / 'code: ', gv_subrc, 'message: ', 'test'.

         endif.


  call method client->receive

    exceptions http_communication_failure  = 1

               http_invalid_state          = 2

               http_processing_failed      = 3

               others                      = 4.

  if sy-subrc <> 0.

     call method client->get_last_error

     importing code    = gv_subrc

               message = errortext.

    write: / 'communication_error( receive )',

           / 'code: ', gv_subrc, 'message: ', 'test'.



  endif.

我不是ABAP和ABAP HTTP框架专家。您能否提供一些有关如何实现方案的提示?

最好的问候,

Saurav

3 个答案:

答案 0 :(得分:1)

要知道HTTP请求是否有效,应在收到以下内容后读取响应:

call method client->receive
...
data(response) = client->response->get_cdata( ). " <== missing part

答案 1 :(得分:1)

我认为在运行时不能忽略RFC目标(事务SM59)的“路径前缀”,因为程序不应该忽略管理员所做的自定义。

(我没有任何官方提论据,我只是做了一次测试以确认您的发现)

这可以看作是操作系统的低级命令,管理员将在事务SM49中定义ABAP程序允许使用的命令,而其他命令则不能使用。

此外,RFC目标的其他数据可能仅对此路径前缀(例如,身份验证)有效。

如果应允许程序访问任何路径,则应要求管理员将路径前缀保留为空。

答案 2 :(得分:0)

尝试以下方法:

cl_http_client=>create_by_url(
  EXPORTING
    url                = lv_url
  IMPORTING
    client             = DATA(lo_http_client)
  EXCEPTIONS
    argument_not_found = 1
    plugin_not_active  = 2
    internal_error     = 3
    OTHERS             = 4 ).

更改URL更方便。