如何在PHP中更改SOAP名称空间以匹配WSDL?

如何在PHP中更改SOAP名称空间以匹配WSDL?,php,soap,wsdl,Php,Soap,Wsdl,我目前正在为我工作的公司做一个项目。该项目将需要向另一家公司发出SOAP请求(通过PHP)。在我的PHP代码中,我有一个与另一家公司的SOAP服务器通信的SOAP客户端,但我得到的只是“无效的XML”。在检查了他们的WSDL和响应之后,我注意到他们的名称空间是不同的。我需要更改我的名称空间以匹配他们的名称空间 例如:我的请求中的标记显示为“ns1.”和“env.”,但它们的标记显示为“soap” 我怎样才能改变这个 下面是我的代码示例,发送的请求和接收的响应 ---------------- C

我目前正在为我工作的公司做一个项目。该项目将需要向另一家公司发出SOAP请求(通过PHP)。在我的PHP代码中,我有一个与另一家公司的SOAP服务器通信的SOAP客户端,但我得到的只是“无效的XML”。在检查了他们的WSDL和响应之后,我注意到他们的名称空间是不同的。我需要更改我的名称空间以匹配他们的名称空间

例如:我的请求中的标记显示为“ns1.”和“env.”,但它们的标记显示为“soap”

我怎样才能改变这个

下面是我的代码示例,发送的请求和接收的响应

---------------- CODE ----------------

  $client = new SoapClient("http://ws.example.com/test/test.asmx?WSDL", array('soap_version'=>SOAP_1_2, 'trace' => 1));

  $result = $client->TestFunction(array('Packet'=>'<Email>test@example.com</Email><Password>examplepassword</Password>'));

  $sessionid = $result->TestFunctionResult;

  print $sessionid;


  echo "REQUEST HEADER:\n" . htmlentities($client->__getLastRequestHeaders()) . "\n";

  echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n";

  echo "RESPONSE HEADER:\n" . htmlentities($client->__getLastResponseHeaders()) . "\n";

  echo "RESPONSE:\n" . htmlentities($client->__getLastResponse()) . "\n";


------------ REQUEST SENT -------------

POST /test/test.asmx HTTP/1.1
Host: ws.example.com
Connection: Keep-Alive
User-Agent: PHP-SOAP/5.3.4
Content-Type: application/soap+xml; charset=utf-8; action="http://ws.example.com/test/TestFunction"
Content-Length: 352

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://ws.example.com/resumes/">
  <env:Body>
    <ns1:TestFunction>
      <ns1:Packet>
        <Email>test@example.com</Email>
        <Password>examplepassword</Password>
      </ns1:Packet>
    </ns1:TestFunction>
  </env:Body>
</env:Envelope>

---------- RESPONSE RECEIVED ----------

HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Content-Length: 450
Content-Type: application/soap+xml; charset=utf-8
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
X-PBY: BEARWS2
Date: Mon, 18 Apr 2011 15:33:51 GMT
Connection: close

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <TestFunctionResponse xmlns="http://ws.example.com/test/">
      <TestFunctionResult>
        <Packet>
          <Error>Invalid XML</Error>
        </Packet>
      </TestFunctionResult>
    </TestFunctionResponse>
  </soap:Body>
</soap:Envelope>

------------code----------------
$client=新的SoapClient(“http://ws.example.com/test/test.asmx?WSDL,数组('soap_version'=>soap_1_2,'trace'=>1));
$result=$client->TestFunction(数组('Packet'=>)test@example.comexamplepassword'));
$sessionid=$result->TestFunctionResult;
打印$sessionid;
echo“请求头:\n”。htmlentities($client->\uu getLastRequestHeaders())。“\n”;
回显“请求:\n”。htmlentities($client->\uu getLastRequest()。“\n”;
echo“响应头:\n”。htmlentities($client->\uu getLastResponseHeaders()。“\n”;
回显“响应:\n”。htmlentities($client->\uu getLastResponse()。“\n”;
------------发送请求-------------
POST/test/test.asmx HTTP/1.1
主机:ws.example.com
连接:保持活力
用户代理:PHP-SOAP/5.3.4
内容类型:应用程序/soap+xml;字符集=utf-8;行动=”http://ws.example.com/test/TestFunction"
内容长度:352
test@example.com
示例密码
----------收到的答复----------
HTTP/1.1200ok
缓存控制:专用,最大年龄=0
内容长度:450
内容类型:应用程序/soap+xml;字符集=utf-8
服务器:Microsoft IIS/7.0
X-AspNet-Version:2.0.50727
X-Powered-By:ASP.NET
X-PBY:BEARWS2
日期:2011年4月18日星期一格林尼治标准时间15:33:51
连接:关闭
无效的XML


我怎样才能避开这个问题?

前缀名称是不相关的。他们不是你问题的原因。这里的标记似乎不匹配:

<ns1:TestFunciton>
    <ns1:Packet>
        <Email>test@example.com</Email>
        <Password>examplepassword</Password>
    </ns1:Packet>
</ns1:TestFunction>

test@example.com
示例密码

请注意
testfunction

的拼写错误前缀名称与此无关。他们不是你问题的原因。这里的标记似乎不匹配:

<ns1:TestFunciton>
    <ns1:Packet>
        <Email>test@example.com</Email>
        <Password>examplepassword</Password>
    </ns1:Packet>
</ns1:TestFunction>

test@example.com
示例密码

注意
testfunction

的拼写错误,我想知道为什么要插入XML标记作为“Packet”的值。如果操作正确(很抱歉,我现在无法亲自检查),SoapClient应该将它们作为实体转义,这将破坏您的请求。此外,我想知道为什么您的请求转储没有更正确地显示这一点,但我认为这可能是因为您正在编辑内容,而不是复制和粘贴

如果操作正确,我想您的请求应该如下所示:

$client->TestFunction(
    array(
        'Packet'=> array(
            'Email' => 'test@example.com', 
            'Password' => 'examplepassword',
        )
    )
);

我想知道为什么要插入XML标记作为“Packet”的值。如果操作正确(很抱歉,我现在无法亲自检查),SoapClient应该将它们作为实体转义,这将破坏您的请求。此外,我想知道为什么您的请求转储没有更正确地显示这一点,但我认为这可能是因为您正在编辑内容,而不是复制和粘贴

如果操作正确,我想您的请求应该如下所示:

$client->TestFunction(
    array(
        'Packet'=> array(
            'Email' => 'test@example.com', 
            'Password' => 'examplepassword',
        )
    )
);

我更改了标签以删除其他公司的私人功能。那只是个打字错误。还有其他建议吗?请始终准确粘贴您在问题中发送的内容。重新打字是个坏主意。他们拒绝您的XML可能还有其他原因,但这不应该是因为您为名称空间选择的前缀是任意的。我更改了标记以删除其他公司的私有函数。那只是个打字错误。还有其他建议吗?请始终准确粘贴您在问题中发送的内容。重新打字是个坏主意。他们拒绝您的XML可能还有其他原因,但这不应该是因为您为名称空间选择的前缀是任意的。