You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IE环境下SAP接口POST请求报错(访问拒绝/未传输)求助

问题:IE环境下SAP接口项目中HTML向ABAP传参报错(Access Denied/Not Transported)

项目要求使用Internet Explorer作为标准调用浏览器,通过ABAP代码加载HTML页面,尝试将HTML中的数据通过SAPEVENT:前缀的URL传递到ABAP的handle_sapevent方法,但在IE中运行时出现Access Denied或Not Transported错误,无法完成数据传输。

现有ABAP代码

REPORT demo_html_input.

INCLUDE: ZCAS_TEXT_POST_HTML_SRC.

TYPES: typ_html_code TYPE TABLE OF char255 WITH EMPTY KEY,
       typ_source    TYPE TABLE OF string.

CLASS html_start DEFINITION.
  PUBLIC SECTION.
    METHODS: constructor,
             txt_html RETURNING VALUE(lt_codigo) TYPE string.
  PRIVATE SECTION.
    DATA: lv_html_code type string.
    METHODS: get_source,
             descomented
             IMPORTING
               lt_source    TYPE typ_source
             EXPORTING
               lv_html_code TYPE string.
ENDCLASS.

CLASS html_start IMPLEMENTATION.
  METHOD constructor.
    get_source( ).
  endmethod.

  METHOD txt_html.
    lt_codigo = lv_html_code.
  ENDMETHOD.

  METHOD get_source.
    DATA: lt_source TYPE TABLE OF string.

    CALL METHOD cl_reca_rs_services=>get_source
      EXPORTING
        id_objtype = 'PROG'
        id_objname = 'ZCAS_TEXT_POST_HTML_SRC'
      IMPORTING
        et_source  = lt_source.

    descomented( EXPORTING
                        lt_source = lt_source
                       IMPORTING
                         lv_html_code = lv_html_code ).
  ENDMETHOD.

  METHOD descomented.
    DATA: ls_html_code TYPE char255.
    DATA: ls_source TYPE string.

    DATA: lv_len_data TYPE i,
          lv_len_source TYPE i,
          lv_len_total TYPE i,
          lv_str_max  type i,
          lv_string TYPE string.

    LOOP AT lt_source INTO ls_source.
      TRY .
          ls_source = ls_source+1.
        CATCH cx_sy_range_out_of_bounds.
      ENDTRY.

      SHIFT ls_source RIGHT DELETING TRAILING ' '.
      SHIFT ls_source LEFT DELETING LEADING ' '.

      lv_string = ls_source .
      CONCATENATE lv_html_code lv_string INTO lv_html_code.
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
  PRIVATE SECTION.
    CLASS-METHODS handle_sapevent
      FOR EVENT sapevent
                  OF cl_abap_browser
      IMPORTING action
                  query_table.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.
    DATA error_list TYPE cl_abap_browser=>html_table.

    SET HANDLER handle_sapevent.

    DATA: retorncode TYPE REF TO html_start.

    CREATE OBJECT retorncode.

    DATA(html_str) = retorncode->txt_html( ).

    cl_abap_browser=>show_html(
      EXPORTING
        html_string = html_str
        title       = 'Input Demo'
      IMPORTING
         html_errors = error_list ).

    IF error_list IS NOT INITIAL.
      MESSAGE 'Error in HTML' TYPE 'I' DISPLAY LIKE 'E'.
    ENDIF.
  ENDMETHOD.
  METHOD handle_sapevent.
    BREAK-POINT.
    DATA(out) = cl_demo_output_stream=>open( ).
    SET HANDLER cl_demo_output_html=>handle_output FOR out.
    out->write_data( iv_name = 'ACTION'      ia_value = action ).
    out->write_data( iv_name = 'QUERY_TABLE' ia_value = query_table ).
    out->close( ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  demo=>main( ).

现有HTML代码

<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=9" />
    <title>Document</title>
</head>

<body>
    <input type="button" id="btn" onclick="">
</body>

<script>
    document.getElementById('btn').addEventListener('click', function sendTOAbap(ev) {
        var oOutput = document.querySelector("div"),
            oData = {
                campo: "sucesso",
                field: "insucesso"
            };

        oData.append("CustomField", "This is some extra data");

        var oReq = new XMLHttpRequest();
        oReq.open("POST", "SAPEVENT:SAPEVENT", true);
        oReq.onload = function (oEvent) {
            if (oReq.status == 200) {
                console.log("Uploaded!");
            } else {
                console.log("Error " + oReq.status + " occurred when trying to upload your file.");
            }
        };

        oReq.send(oData);
        ev.preventDefault();
    }, false);
</script>

</html>

解决方案

针对IE的兼容性问题,需从以下几点修正代码:

1. 修正JavaScript数据格式与调用逻辑

IE9及以上版本中,XMLHttpRequest不支持直接发送普通JavaScript对象作为请求体,且普通对象没有append方法(原代码此处存在逻辑错误)。推荐使用表单提交(IE兼容性最佳),或修正FormData的使用方式:

<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=9" />
    <title>Document</title>
</head>

<body>
    <input type="button" id="btn" value="Send to SAP">
    <!-- 隐藏表单用于兼容IE提交 -->
    <form id="sapForm" action="SAPEVENT:SAPEVENT" method="POST" style="display:none">
        <input type="hidden" name="campo" id="campo">
        <input type="hidden" name="field" id="field">
        <input type="hidden" name="CustomField" id="CustomField">
    </form>
</body>

<script>
    document.getElementById('btn').addEventListener('click', function sendTOAbap(ev) {
        // 方式1:表单提交(IE兼容性最优)
        document.getElementById('campo').value = "sucesso";
        document.getElementById('field').value = "insucesso";
        document.getElementById('CustomField').value = "This is some extra data";
        document.getElementById('sapForm').submit();

        // 方式2:若需保留XHR,修正FormData使用(IE9+支持)
        /*
        var oData = new FormData();
        oData.append("campo", "sucesso");
        oData.append("field", "insucesso");
        oData.append("CustomField", "This is some extra data");

        var oReq = new XMLHttpRequest();
        oReq.open("POST", "SAPEVENT:SAPEVENT", false); // IE中同步请求更稳定
        try {
            oReq.send(oData);
            console.log("Uploaded!");
        } catch (e) {
            console.log("Error: " + e.message);
        }
        */
        ev.preventDefault();
    }, false);
</script>

</html>

2. 关键修正点说明

  • 表单提交方式:IE中直接通过表单提交到SAPEVENT:SAPEVENT可避免XHR的权限限制问题,是兼容性最优的方案。
  • FormData修正:原代码错误地给普通对象调用append方法,需创建FormData实例存储键值对。
  • 同步XHR(可选):若使用XHR,IE中同步请求(open方法第三个参数设为false)比异步请求更稳定,可规避访问权限报错。

3. ABAP端无需额外调整

原ABAP代码中的handle_sapevent方法可正常接收表单提交或XHR发送的参数,query_table内会包含所有传递的键值对。

内容的提问来源于stack exchange,提问作者Caio Abreu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:05:55