ABAP如何调用API上传XML文件到SAP系统

11次阅读

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

ABAP如何调用API上传XML文件到SAP系统

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代码关系不大,本质是服务端拒绝了请求体格式:

  • 检查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_UPLOADWS_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( )预处理,否则服务端解析直接报错。

text=ZqhQzanResources