SAP 问题:如果从 ABAP 程序多次调用同一个 BSP 页面,则没有响应

问题描述 投票:0回答:2

我的 ABAP 程序中有一个包含几行数据的内部表。我循环遍历该表并为每个条目调用相同的 BSP 页面。 目标是读取 HTML 格式的每一行数据,然后将其下载为 HTML 文件。

问题是: 第一次调用(第一次运行)工作正常并返回 HTML 文本,但在下一次调用(下一个数据行)时,方法

http_client->response->get_cdata( )
不会返回任何数据,即使一切运行都没有错误(响应状态 = 200)。

还有两点:

  1. 我编辑了代码,以便在循环之外创建
    http_client
    实例 (
    call method cl_http_client=>create_internal()
    ),但不幸的是它也不起作用。
  2. 我调试了它,每次数据输入请求都会通过BSP应用程序(页面),但我无法跟踪数据丢失的位置!

提前致谢。

调用逻辑如下:

loop at it_data .....
  ......
  ......

   CALL METHOD cl_http_ext_webapp=>create_url_for_bsp_application
      EXPORTING
        bsp_application      = iv_app
        bsp_start_page       = iv_page
        bsp_start_parameters = lt_params      
      IMPORTING
        abs_url              = lv_url.

*   Create internal http client
    CALL METHOD cl_http_client=>create_internal
      IMPORTING
        client            = lr_http_client
      EXCEPTIONS
        plugin_not_active = 1
        internal_error    = 2
        OTHERS            = 3.
    IF sy-subrc <> 0.
      ev_error = abap_true.
      RETURN.
    ENDIF.

    cl_http_utility=>set_request_uri( request  = lr_http_client->request
                                                 uri      = lv_url ).

    lr_http_client->request->set_header_field( name  = '~request_method'
                                                       value = 'GET' ).


*   Send and recieve
    lr_http_client->send(
      EXCEPTIONS
        http_communication_failure = 1
        http_invalid_state         = 2
        http_processing_failed     = 3
        http_invalid_timeout       = 4
        OTHERS                     = 5
    ).
    IF sy-subrc = 0.
      lr_http_client->receive(
        EXCEPTIONS
          http_communication_failure = 1
          http_invalid_state         = 2
          http_processing_failed     = 3
          OTHERS                     = 4
      ).
    ENDIF.

    IF sy-subrc <> 0.
      CALL METHOD lr_http_client->get_last_error
        IMPORTING
          code    = lv_rc
          message = lv_message.
      ev_error = abap_true.
      RETURN.
    ENDIF.

    lr_http_client->response->get_status( IMPORTING code   = lv_rc
                                                    reason = lv_reason ).
    IF lv_rc = 200.
      ev_html = lr_http_client->response->get_cdata( ).
    ELSE.
      ev_error = abap_true.
      RETURN.
    ENDIF.

    lr_http_client->close( ).

endloop.
http client abap sap-bsp
2个回答
0
投票

我只是猜测,但问题可能是由于循环发送 HTTP 请求造成的。相反,尝试首先收集所有 URL(为具有不同参数的 BSP 应用程序创建),然后一起处理请求。如果是同步问题,以下方法可以解决。

解决方案直接来自此博客

DATA: clients type standard table of if_http_client.

  
  LOOP it_data...
   CALL METHOD cl_http_ext_webapp=>create_url_for_bsp_application
      EXPORTING
        bsp_application      = iv_app
        bsp_start_page       = iv_page
        bsp_start_parameters = lt_params      
      IMPORTING
        abs_url              = lv_url.

    cl_http_client=>create_by_url(
      EXPORTING
        url                = lv_url
      IMPORTING
        client             = DATA(client)
    ).

    APPEND client TO clients.

    client->request->set_method( if_rest_message=>gc_method_get ).
    client->send( ).
  ENDLOOP.
  
  LOOP AT clients INTO client.
    client->receive( ).
    //Handling response
    ....
    client->close( ).
  ENDLOOP.

0
投票

感谢您的帮助。

错误出在 BSP 应用程序设置中。 我解决如下: 1- BSP 应用程序属性 -> 设置为有状态。 2- BSP 页面属性->生命周期更改为“请求”。 (这决定了页面/控制器的实例将保留多长时间。)

现在可以正常使用了。

© www.soinside.com 2019 - 2024. All rights reserved.