我的 ABAP 程序中有一个包含几行数据的内部表。我循环遍历该表并为每个条目调用相同的 BSP 页面。 目标是读取 HTML 格式的每一行数据,然后将其下载为 HTML 文件。
问题是: 第一次调用(第一次运行)工作正常并返回 HTML 文本,但在下一次调用(下一个数据行)时,方法
http_client->response->get_cdata( )
不会返回任何数据,即使一切运行都没有错误(响应状态 = 200)。
还有两点:
http_client
实例 (call method cl_http_client=>create_internal()
),但不幸的是它也不起作用。提前致谢。
调用逻辑如下:
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 请求造成的。相反,尝试首先收集所有 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.
感谢您的帮助。
错误出在 BSP 应用程序设置中。 我解决如下: 1- BSP 应用程序属性 -> 设置为有状态。 2- BSP 页面属性->生命周期更改为“请求”。 (这决定了页面/控制器的实例将保留多长时间。)
现在可以正常使用了。