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

ABAP向IIS 10发送压缩HTTP请求,PHP接收未解压乱码数据问题

问题:ABAP请求开启压缩后IIS未自动解压,PHP收到压缩二进制数据

我们通过HTTP请求从ABAP向IIS 10服务器发送XML文件,由PHP处理。未压缩的数据传输正常,但开启ABAP的压缩功能后,PHP接收到的是乱码的二进制压缩格式数据,文件大小远小于原数据,说明数据仍处于压缩状态。按预期,IIS应在将数据交给PHP前完成解压,无需额外处理,但目前未实现。

ABAP发送代码

method send_xstring_by_https.     
     data string_content type string.
     do 200 times.
        string_content = |{ string_content }this is an example XML - some Umlauts: üöä.|.
     enddo.

     "Content gets the type xstring
     content = cl_abap_codepage=>convert_to( source = |<?xml version="1.0" encoding="iso-8859-1"?><someData>{ string_content }</someData>|
                                             codepage = |ISO-8859-1| ).
     DATA: o_client TYPE REF TO if_http_client.

     cl_http_client=>create_by_url( EXPORTING
                                      url     = |<your_url>|
                                    IMPORTING
                                      client  = o_client ).


     o_client->request->set_version( version = if_http_request=>co_protocol_version_1_1 ).
     o_client->request->set_method( if_http_request=>CO_REQUEST_METHOD_GET ).
     o_client->request->set_content_type( 'text/xml; charset=ISO-8859-1' ).
     data(length_content) = xstrlen( content ).
     o_client->propertytype_accept_compress = if_http_client=>co_enabled.
***     "Compression remove *** to set compression
***     o_client->set_compression( if_http_client=>co_compress_in_all_cases ).
     o_client->request->SET_DATA(
       exporting
         DATA               = content    " Binary Data
         LENGTH             = length_content    " Length of Binary Data
     o_client->send( if_http_client=>co_timeout_default ).

     o_client->receive( EXCEPTIONS
                          HTTP_COMMUNICATION_FAILURE = 1
                          HTTP_INVALID_STATE = 2
                          HTTP_PROCESSING_FAILED = 3
                      ).
  endmethod.

PHP接收代码

<?php
    $content = file_get_contents('php://input');

    if (!file_put_contents(<local_path_and_filename>, $content)) {
        echo "ERROR";
    }
?>

测试说明

示例默认发送未压缩数据,移除ABAP代码中的***注释即可开启压缩。代码会生成较长的XML文件,若文件过短则不会触发压缩,可将循环次数设为1并开启压缩进行测试。

已排查情况

  • 查找IIS接收请求的压缩设置,但未找到相关选项,仅找到IIS发送响应的压缩设置(已开启动态和静态压缩)
  • 尝试修改content type为application/xml等,问题仍未解决

预期流程

  • ABAP请求设置未压缩内容
  • SAP Netweaver发送请求并允许压缩传输
  • SAP Netweaver与IIS协商压缩方式
  • SAP Netweaver发送压缩后的请求
  • IIS接收并解压请求数据
  • PHP获取解压后的数据

目前不清楚需要修改PHP代码的哪部分来解决问题。


解决方案

首先明确:IIS默认不支持自动解压请求数据,它的压缩设置仅针对响应输出,不对请求输入做处理。因此必须在PHP层手动判断并解压内容。

修改后的PHP代码

<?php
$content = file_get_contents('php://input');

// 检查请求是否携带gzip压缩标识
if (isset($_SERVER['HTTP_CONTENT_ENCODING']) && strpos($_SERVER['HTTP_CONTENT_ENCODING'], 'gzip') !== false) {
    // 解压gzip格式的内容
    $content = gzdecode($content);
}

if (!file_put_contents('<local_path_and_filename>', $content)) {
    echo "ERROR";
}
?>

额外说明

  1. 确认压缩类型:可以在PHP中打印$_SERVER['HTTP_CONTENT_ENCODING'],确认ABAP实际使用的压缩算法(默认是gzip)
  2. 若ABAP使用deflate压缩,将gzdecode()替换为gzuncompress()(注意部分场景下deflate格式可能需要额外处理头部)
  3. IIS层面无配置可自动解压请求数据,必须在应用层(PHP)完成处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:42:32