简体   繁体   English

使用PHP和wsdl2php添加SOAP标头

[英]Adding a SOAP header with PHP and wsdl2php

I'm a complete newb to PHP programming but have been tasked with writing an example PHP web services client that consumes my company's web service that is written in Java. 我是PHP编程的完全新手,但我的任务是编写一个示例PHP Web服务客户端,它使用我公司用Java编写的Web服务。 We have two types of services. 我们有两种类型的服务。 Those that require authentication and those that don't. 需要身份验证的人和不需要身份验证的人。 I've used the wsdl2php library to successfully communicate with our services that don't need authentication. 我已经使用wsdl2php库成功地与不需要身份验证的服务进行通信。 Our secure services require that I add a SOAP header to my request that looks like this: 我们的安全服务要求我在我的请求中添加一个SOAP标头,如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sen="https://webservices.averittexpress.com/SendWebImageService"> 
    <soapenv:Header xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
        <ns:authnHeader soapenv:mustUnderstand="0" xmlns:ns="http://webservices.averittexpress.com/authn"> 
            <Username>xxxxxxxx</Username> 
            <Password>xxxxxxxx</Password> 
        </ns:authnHeader> 
    </soapenv:Header> 

The problem I've got is that I have no idea how to do this with wsdl2php or if it is even possible. 我遇到的问题是我不知道如何使用wsdl2php或者甚至是可能的。 Here's the PHP file I'm currently using to test. 这是我目前用来测试的PHP文件。

<?php

require_once 'LTLRateQuoteService.php';

$rqs = new LTLRateQuoteService();
$info = new ShipmentInfo();
$HeaderSecurity = array("authnHeader"=>array("UserName"=>"xxxxxx",
                                             "Password"=>"xxxxxx",));

$header[] = new SoapHeader("http://schemas.xmlsoap.org/soap/encoding",
                           "Header",$HeaderSecurity);

$rqs->__setSoapHeaders($header);

$args = new AvtLTLRateQuoteRequest();
$args->AccountNumber = '1234578';
$args->OriginCity = 'Cookeville';
$args->OriginState = 'TN';
$args->OriginZip = '38501';
$args->DestinationCity = 'Morristown';
$args->DestinationState = 'TN';
$args->DestinationZip = '37814';
$args->ShipDate = '12/12/2011';
$args->Customer = 'S';
$args->PaymentType = 'P';

$info->NumPieces = '1';
$info->NumHandling = '1';
$info->CubicFeet = '1';
$info->Items = '1';
$info->TotalItem = '1';
$info->TotalWeight = '100';
$args->ShipmentInfo = $info;

$grq = new getLTLRate();
$grq->arg0 = $args; 

$response = $rqs->getLTLRate($grq);
$details = $response->return;
print 'Total Freight Charge: ' . $details->TotalFreightCharge . ' ';
?>

I need to somehow attach the username and password to the header on this request and have no idea how to do it. 我需要以某种方式将用户名和密码附加到此请求的标头上,并且不知道如何操作。 I'm looked at the wsdl2php site and there's very little there in terms of documentation on how to use the library. 我看了wsdl2php网站,关于如何使用该库的文档方面很少。 Any help would be appreciated. 任何帮助,将不胜感激。

Thanks, 谢谢,

Andrew 安德鲁

Do not listen to the rude commenting trolls without the answers, only insults. 如果没有答案,不要聆听粗鲁的评论巨魔,只有侮辱。 here is how i did it. 这是我怎么做的。

function __construct($url='wsdl url')
 {
    $auth=array('AccountUsername'=>'test','AccountPW'=>'test');
    $authvalues = new \SoapVar($auth, SOAP_ENC_OBJECT);
    $header =  new \SoapHeader('http://www.nsurl.com/', 
                                'AuthenticationHeader', // Rename this to the tag you need
                                $authvalues, false);

    $this->soapClient = new SoapClient($url,array("classmap"=>self::$classmap,"trace" => true,"exceptions" => true));
    $this->soapClient->__setSoapHeaders(array($header));
    //set the Headers of Soap Client.
    //$this->soapClient->__setSoapHeaders($header);
}

Rather then using wsdl2php, would using PHP's in-house SOAP functions work better? 而不是使用wsdl2php,使用PHP的内部SOAP功能会更好吗?

http://php.net/manual/en/class.soapclient.php http://php.net/manual/en/class.soapclient.php

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM