php SOAP 响应编码问题

Posted

技术标签:

【中文标题】php SOAP 响应编码问题【英文标题】:php SOAP response encoding issue 【发布时间】:2015-05-08 20:55:21 【问题描述】:

我所要做的就是更改我的 php.ini 文件中的默认字符集

default_charset = "UTF-8"

我正在尝试在 PHP 中创建一个 SOAP 客户端,但我遇到了编码问题。 $Response 包含不正确字符的单词,例如 è 而不是 è。

将 WSDL 文件导入SoapUI(soap 测试套件)时,响应会正确编码,因此我认为它与 SOAP 服务无关。 SoapUI 表明它正在使用 UTF-8。我也尝试了很多其他encodings,但没有成功。

我所有的 php 文件都以 UTF-8 编码。

$client = new SoapClient($wsdl_file, array('encoding'=>'UTF-8'));
$Response = $client->__soapCall('GetMemberDetails', array($request));
debug($Response); die;

示例响应:

<members xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <UserInfo>
    ...
    <Status>règle</Status>
    ...
  </UserInfo>
</members>

这是来自 SoapUI 的原始请求

POST http://test.app.com/WebServices/MemberService/MemberService.svc HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://test.org/MemberService/GetMemberDetails"
Content-Length: 419
Host: test.app.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

有没有办法在 PHP 中从 SoapClient 获取相同类型的原始请求?

edit:我在 __doRequest 中截获了请求。下面是SoapClient和SoapUI的区别

SoapClient(收到编码错误)

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://test.org/">
  <SOAP-ENV:Body>
    <ns1:GetMemberDetails>
      <ns1:memberId>123</ns1:memberId>
    </ns1:GetMemberDetails>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

SoapUI(接收正确的编码)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://test.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:GetMemberDetails>
         <!--Optional:-->
         <tem:memberId>123</tem:memberId>
      </tem:GetMemberDetails>
   </soapenv:Body>
</soapenv:Envelope>

【问题讨论】:

【参考方案1】:

确保 php 字符集配置正确

在您的 php.ini 文件中

default_charset = "UTF-8"

【讨论】:

以上是关于php SOAP 响应编码问题的主要内容,如果未能解决你的问题,请参考以下文章

不支持SOAP编码

HTML 和 PHP cURL 响应 utf-8 编码问题

使用soap4r时出现问题,无法将命名空间、编码样式添加到soap信封

从 PHP Web 服务未正确返回编码响应

WebService发布协议--SOAP和REST的区别

C# - 如何从响应中获取值