ABAP中上传XML需用CL_HTTP_CLIENT发送POST请求,而非直接调用API;关键在于构造符合服务要求的HTTP请求,设置Content-Type为application/xml、UTF-8编码、正确认证与超时,并避免GUI_UPLOAD等误用。

ABAP里没有直接“调用API上传XML文件”的标准函数
ABAP本身不提供类似 curl -X POST 那样的通用HTTP客户端上传能力(尤其在老版本中),所谓“调用API上传XML”,实际是两步:先构造符合SAP后端服务要求的HTTP请求(含XML payload),再用ABAP的HTTP工具类发送。关键不在“上传文件”这个动作,而在目标服务是否暴露了接收XML的REST/OData/BAPI接口——比如/sap/opu/odata/sap/API_BUSINESS_PARTNER 或自建的IF_HTTP_EXTENSION处理器。
用CL_HTTP_CLIENT发POST请求传XML最常用
这是ABAP 7.02+ 的标准方式,适用于对接SAP Gateway、Fiori后端或自定义HTTP服务。注意它不处理“文件上传”语义(如multipart/form-data),而是把XML当纯文本塞进请求体:
- 必须手动设置
Content-Type: application/xml(不是text/xml,某些SAP服务校验严格) -
XML内容需是UTF-8编码的字符串,用cl_abap_codepage=>convert_to_utf8( )转码避免乱码 - 若服务要求认证,用
client->request->set_header_field( name = 'Authorization' value = 'Basic ...' ),别依赖SM59配置的凭证(它只对RFC有效) - 超时必须显式设,否则默认可能卡住:
client->timeout = 60
DATA: lo_client TYPE REF TO if_http_client,
lv_xml TYPE string.
lv_xml = `123 `.
cl_http_client=>create_by_url(
EXPORTING
url = 'https://my-s4hana.example.com/sap/opu/odata/sap/API_BUSINESS_PARTNER'
IMPORTING
client = lo_client ).
lo_client->request->set_method( if_http_request=>co_method_post ).
lo_client->request->set_header_field( name = 'Content-Type' value = 'application/xml; charset=utf-8' ).
lo_client->request->set_cdata( data = lv_xml ).
lo_client->send( ).
lo_client->receive( ).
IF lo_client->response->get_status( )-code = 201.
" 成功
ENDIF.
遇到HTTP 415 Unsupported Media Type先查这三点
这是XML上传失败最典型的错误,和ABAP代码关系不大,本质是服务端拒绝了请求体格式:
【极品模板】出品的一款功能强大、安全性高、调用简单、扩展灵活的响应式多语言企业网站管理系统。 产品主要功能如下: 01、支持多语言扩展(独立内容表,可一键复制中文版数据) 02、支持一键修改后台路径; 03、杜绝常见弱口令,内置多种参数过滤、有效防范常见XSS; 04、支持文件分片上传功能,实现大文件轻松上传; 05、支持一键获取微信公众号文章(保存文章的图片到本地服务器); 06、支持一键
- 检查
Content-Type头是否拼写错误,比如写成application/xml;charset=utf-8(少了空格)或text/xml - 确认XML根节点名、命名空间(
xmlns)是否与服务文档完全一致——SAP OData服务常要求xmlns="http://www.sap.com/abapxml/types" - 服务是否强制要求
Accept: application/xml头?漏掉也会触发415
不要用GUI_UPLOAD或WS_UPLOAD传XML到后端API
这两个函数是为前端(SAP GUI)本地文件读取设计的,读出来的是二进制或内表,无法直接变成HTTP请求体。硬要套用会导致XML被当作普通文件流处理,服务端收不到合法XML结构。真要从GUI选文件再上传,流程必须是:GUI_UPLOAD → 转STRING → UTF-8转码 → CL_HTTP_CLIENT发送,中间缺一不可。
真正容易被忽略的是XML中的特殊字符(如&、)——如果XML由ABAP动态拼接生成,必须用cl_abap_behavior_utility=>escape_xml( )预处理,否则服务端解析直接报错。









