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"; } ?>
额外说明
- 确认压缩类型:可以在PHP中打印
$_SERVER['HTTP_CONTENT_ENCODING'],确认ABAP实际使用的压缩算法(默认是gzip) - 若ABAP使用deflate压缩,将
gzdecode()替换为gzuncompress()(注意部分场景下deflate格式可能需要额外处理头部) - IIS层面无配置可自动解压请求数据,必须在应用层(PHP)完成处理
内容的提问来源于stack exchange,提问作者Xilukarim
相关产品推荐
相关产品推荐

