ABAP如何调用API上传XML文件到SAP系统
技术百科
幻夢星雲
发布时间:2026-01-27
浏览: 次 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代码关系不大,本质是服务端拒绝了请求体格式:
- 检查
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( )预处理,否则服务端解析直接报错。
# 后端
# app
# 工具
# curl
# String
# 编码
# xml
# gate
# 前端
# 命名空间
# asic
# 处理器
# gateway
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c++中的std::conjunction和std
- php命令行怎么运行_通过CLI模式执行PHP脚本
- Win11怎么关闭自动修复_跳过Win11开机自动
- Windows10电脑怎么连接蓝牙设备_Win10
- Laravel 查询 JSON 列:高效筛选包含数
- Win10怎么关闭自动更新错误弹窗_Win10策略
- Win10 BitLocker加密教程 Win10
- Win11怎么设置单手模式_Win11触控键盘布局
- Win10怎样清理C盘浏览器缓存_Win10清理浏
- Win10怎样设置多显示器_Win10多显示器扩展
- PyTorch DDP 多进程训练在 Kaggle
- Win11如何设置省电模式 Win11开启电池节电
- c++如何打印函数堆栈信息_c++ backtra
- Win10怎样卸载iTunes_Win10卸载iT
- Win11怎么关闭自动调节屏幕亮度_Windows
- 如何解决Windows时间不准的问题?(自动同步设
- c++中如何求一个数的平方根_c++ sqrt函数
- Go语言中CookieJar的持久化机制解析:内存
- php中$this和::能混用吗_对象与静态作用域
- Python lxml的etree和Element
- c++ try_emplace用法_c++ map
- Win11怎么设置系统还原_Windows11系统
- Windows执行文件被SmartScreen拦截
- Win11怎么设置开机问候语_自定义Win11锁屏
- Win10如何卸载微软拼音输入法 Win10只保留
- VSC怎样用终端运行PHP_命令行执行脚本的步骤【
- Win11怎么调整屏幕亮度_Windows 11调
- C++如何解析JSON数据?(nlohmann/j
- 如何使用Golang指针与结构体结合_修改结构体内
- Win11怎么连接投影仪_Win11多显示器投屏设
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- c++如何利用doxygen生成开发文档_c++
- Win11怎样安装企业微信_Win11安装企业微信
- Win11怎么查看已连接wifi密码 Win11查
- Windows10如何更改桌面图标间距_Win10
- Win11如何暂停系统更新 Win11暂停更新最长
- Win11怎么关闭小组件_Win11禁用任务栏天气
- 如何在包含多值的列中精准搜索指定演员?
- Win11怎么设置虚拟内存_Windows 11优
- 短链接怎么自定义还原php_修改解码规则适配需求【
- 如何用正则与预处理结合精准拦截拼接式垃圾域名
- php修改数据怎么批量改状态_批量更新status
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- Windows10怎么卸载预装软件_Windows
- Python抽象类与接口设计_规范说明【指导】
- Win11怎样激活系统密钥_Win11系统密钥激活
- Python函数接口文档化_自动化说明【指导】
- php删除数据怎么软删除_添加is_del字段标记
- Win10系统怎么查看显卡温度_Win10任务管理
- 如何减少Golang内存碎片化_Golang内存分


QQ客服