发送PHP SOAP请求时出现错误请求,但请求本身正确

发送PHP SOAP请求时出现错误请求,但请求本身正确,php,web-services,soap,wsdl,soapui,Php,Web Services,Soap,Wsdl,Soapui,我已经被这个问题困扰了好长时间,在搜索了好几个小时后,我一直找不到解决方案 我使用的是联邦快递的网络服务,它会返回运费。下面是我的php代码 try { $client = new SoapClient($path_to_wsdl, array( 'uri' => 'http://fedex.com/ws/rate/v14', 'location' => 'https://ws.fedex

我已经被这个问题困扰了好长时间,在搜索了好几个小时后,我一直找不到解决方案

我使用的是联邦快递的网络服务,它会返回运费。下面是我的php代码

try { 

    $client = new SoapClient($path_to_wsdl, array(
                     'uri' => 'http://fedex.com/ws/rate/v14',
                     'location' => 'https://ws.fedex.com:443/web-services/rate',
                     'soap_version' => 'SOAP_1_1',
                     'login' => 'myusername',       //I don't know whether this is needed but but it is an internal company site 
                     'password' => 'password',      //so I log in with this username and pw to see it
                     'proxy_host' => 'proxy-host-name',
                     'proxy_port' => 443,
                     'proxy_login'    => '',
                     'proxy_password' => '',
                     'trace' => 1,
                     'exceptions' => 1));

    $data = array(
        'Action' => "http://fedex.com/ws/rate/v14/getRates"
    );
    $header = new SoapHeader('http://fedex.com/ws/rate/v14', 'FedexHeader', $data, false);
    $client->__setSoapHeaders($header);

    if(setEndpoint('changeEndpoint')){
        $newLocation = $client->__setLocation(setEndpoint('endpoint'));
    }
    $response = $client -> getRates($request);
} catch (SoapFault $exception) {
    echo '<h2>exception</h2>';
    print_r($exception); 
    echo '<br/><h2>exception trace</h2>';
    var_dump($exception->getTraceAsString());

    echo '<br/>Request headers : <br/><xmp>', 
        $client->__getLastRequestHeaders(), 
        '</xmp><br/>';
    echo 'Request : <br/><xmp>', 
        $client->__getLastRequest(), 
        '</xmp><br/>';
    echo 'Response headers: <br/><xmp>', 
        $client->__getLastResponseHeaders(), 
        '</xmp><br/>';
    echo 'Response : <br/><xmp>', 
        $client->__getLastResponse(), 
        '</xmp><br/>';               
        printFault($exception, $client);        
}
和响应头:

HTTP/1.1 400 Bad Request 
Date: Mon, 17 Feb 2014 16:25:56 
GMT Server: Apache/2.2 
Content-Length: 226 
Connection: close 
Content-Type: text/html; charset=iso-8859-1
下面是生成的SOAP请求本身的一部分:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://fedex.com/ws/rate/v14" xmlns:ns2="http://www.w3.org/2005/08/addressing">
    <SOAP-ENV:Header>
      <ns2:Action>http://fedex.com/ws/rate/v14/getRates</ns2:Action>
    </SOAP-ENV:Header>

    <SOAP-ENV:Body>
      <ns1:RateRequest>
         <ns1:WebAuthenticationDetail>
            <ns1:UserCredential>
               //user credentials
            </ns1:UserCredential>
         </ns1:WebAuthenticationDetail>
         <ns1:ClientDetail>
           //client details
         </ns1:ClientDetail>
         <ns1:RequestedShipment>
            //shipping details ..
         </ns1:RequestedShipment>
      </ns1:RateRequest>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

http://fedex.com/ws/rate/v14/getRates
//用户凭据
//客户详细信息
//装运详情。。
问题是,当我将此请求粘贴到SOAP UI中时,它会返回正确的响应。联邦快递的支持团队也确认了这一点

这就是为什么我认为这是PHP的一个错误。(我在很长一段时间内收到一个无法连接到主机的错误-我相信这与代理主机有关,但我们的ops团队已确认此请求现在正在命中代理,因此我认为这已得到解决)

我在其他几篇文章中看到了对设置SoapHeader的引用,所以我已经这样做了——但是我不确定我是否使用了正确的名称空间。另外,我想知道是否应该使用soapAction而不是Action,因为wsdl指的是soapAction?以下是wsdl文件中的部分:

<operation name="getRates">
  <s1:operation soapAction="http://fedex.com/ws/rate/v14/getRates" style="document"/>
</operation>

然而,我已经尝试使用这两种方法,但都没有效果。此外,此请求在SoapUI中工作,无需soap头

更新:我最初确实认为这可能与SSL有关,但与联邦快递支持人员交谈时,我似乎不需要使用SSL

请求在SoapUI中工作的事实确实让我认为它必须在代码中


如果您能提供更多关于如何调试此问题的提示或建议,我们将不胜感激。

我已经更新了代码,在SoapClient构造函数中包含了一些新参数。我在这一点上的主要问题是SSL问题-这可能是导致问题的原因吗?但如果是这样,为什么请求在SoapUI中工作。我一直在阅读,主机上安装了OpenSSL,但我没有证书或密码信息。在我尝试设置证书之前,我想知道这一点是否有必要?任何关于这方面的信息或者关于可能导致错误请求的原因的信息都会非常棒。我已经向联邦快递的支持部门询问了SSL,他们说“我不知道需要在事务本身中提供SSL详细信息,不。我个人在通过SoapUI运行XML或Soap/XML事务时不必这样做。”所以现在我倾向于认为,仅仅因为我们的网站使用SSL,并不意味着我们需要SSL身份验证来访问联邦快递的web服务。。所以是其他原因导致了这个问题,所以一位同事在另一台服务器上运行了这个代码,它工作得非常好。因此PHP代码本身可能很好。因此,这可能意味着服务器的配置方式有所不同——有人知道这可能是什么吗?
<operation name="getRates">
  <s1:operation soapAction="http://fedex.com/ws/rate/v14/getRates" style="document"/>
</operation>