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
相关产品推荐
相关产品推荐

