Abap 更改目标的路径前缀

Abap 更改目标的路径前缀,abap,Abap,我有一个目的地是由某个程序自动创建的 现在,我想在运行时以编程方式更改目标的路径前缀。这可能吗 我正在看这些文件 这说明,如果未提及路径前缀,则可以更改URI。所以我有一个没有路径前缀的目的地,然后我尝试使用方法“if_http_utility~set_request_uri”,但这也不起作用 代码样本附呈 *&---------------------------------------------------------------------* *& Report htt

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

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

我正在看这些文件

这说明,如果未提及路径前缀,则可以更改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
      others              = 6.
    
cl_http_utility=>set_request_uri( request = client->request uri = uri ).
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 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 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.
*&---------------------------------------------------------------------*
*&报告http_目的地_程序
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
报告http_目的地_程序。
数据客户端类型参照if\U http\U客户端。
数据cl_http_util类型ref到cl_http_实用程序。
数据目的地类型rfcdest。
数据gv_subrc类型sysubrc。
数据uri类型字符串。
数据超时类型I。
数据错误文本类型字符串。
uri='/do/b/json'。
DEST='SAP'。
errortext='无法连接到服务器'。
超时=0。
调用方法cl\u http\u client=>create\u by\u destination
导出目的地=目的地
导入客户端=客户端
例外情况
其他=6。
cl\u http\u实用工具=>设置请求uri(请求=客户端->请求uri=uri)。
gv_subrc=cl_http_实用工具=>get_last_error()。
如果gv_子区域为0。
写入:/“错误的URI格式”。
出口
恩迪夫。
写“你好,索拉夫”。
调用方法客户端->发送
导出超时=超时
例外情况其他=4。
如果sy subrc为0。
调用方法客户端->获取上次错误
导入代码=gv_subrc
message=errortext。
写入:/“通信错误(发送)”,
/“代码:”,gv_subrc,“消息:”,“测试”。
恩迪夫。
调用方法客户端->接收
例外情况其他=4。
如果sy subrc为0。
调用方法客户端->获取上次错误
导入代码=gv_subrc
message=errortext。
写入:/“通信错误(接收)”,
/“代码:”,gv_subrc,“消息:”,“测试”。
恩迪夫。
我不是ABAP和ABAPHTTP框架方面的专家。你能提供一些关于如何实现我的方案的提示吗

致以最良好的祝愿

Saurav

试试这个:

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更方便。

试试这个:

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更方便。

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

call method client->receive
...
data(response) = client->response->get_cdata( ). " <== missing part
调用方法客户端->接收
...

数据(响应)=客户端->响应->获取cdata()。“要知道HTTP请求是否有效,您应该在收到以下内容后读取响应:

call method client->receive
...
data(response) = client->response->get_cdata( ). " <== missing part
调用方法客户端->接收
...
data(response)=client->response->get_cdata()。“我认为RFC目的地(事务SM59)的“路径前缀”在运行时不能被忽略,因为管理员所做的定制不应该被程序忽略

(我没有任何正式的论证参考资料,我只是做了一个测试来证实你的发现)

这类似于操作系统的低级命令,管理员将在事务SM49中定义ABAP程序允许使用的命令,其他命令不能使用

此外,RFC目的地的其他数据可能仅对该路径前缀有效(例如认证)

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

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

(我没有任何正式的论证参考资料,我只是做了一个测试来证实你的发现)

这类似于操作系统的低级命令,管理员将在事务SM49中定义ABAP程序允许使用的命令,其他命令不能使用

此外,RFC目的地的其他数据可能仅对该路径前缀有效(例如认证)


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

CL\u HTTP\u客户端=>CREATE\u BY\u DESTINATION
+
CL\u HTTP\u实用程序=>SET\u REQUEST\u URI
应能正常工作。请提供您的代码示例,并提供其不起作用的详细信息。感谢您的响应…代码示例已附加..我故意提供了错误的URI,但发送方法仍返回0作为响应它不可能知道它是否起作用,因为您在收到->
数据(响应)后没有读取响应=客户端->响应->获取cdata().
SAP论坛中也提出了一个问题:非常感谢…..我原以为发送/接收方法本身会抛出错误…但它们的错误实际上是关于建立http客户端的连接…要检查响应的错误,我们需要检查http客户端的响应对象
CL\u http\u client=>CREATE\u BY\u DESTINATION
+
CL\u HTTP\u实用工具=>SET\u REQUEST\u URI
应该可以工作。请提供您的代码示例,并提供其不起作用的详细信息。感谢您的响应…代码示例已附加..我故意提供了错误的URI,但发送方法仍返回0作为响应它不可能知道它是否起作用,因为您在收到->
数据(响应)后没有读取响应=客户端->响应->获取cdata().
SAP论坛上也提出了一个问题:非常感谢……我原以为发送/接收方法本身会抛出错误……但它们的错误实际上是关于建立http客户端的连接……要检查响应的错误,我们需要检查http客户端的响应对象感谢响应,但我的要求更多目标部分,因为我必须使用中的现有目标