Search code examples
phpsoapwsdlsoap-client

Calling a remote function using SoapClient in PHP


I am using SoapClient to access Pubmatic's remote function : getPublisherAdTagReport() wsdl being: "http://beta-api.pubmatic.com/v1/PublisherDemandInsightsService?wsdl"

the code goes like:

    $soapClient = new SoapClient("http://beta-api.pubmatic.com/v1/PublisherDemandInsightsService?wsdl"); 

    // Prepare SoapHeader parameters 
    $head_param = array('Authorization'=>"Bearer ".$access_token); 
    $headers = new SoapHeader('http://beta-api.pubmatic.com/v1/PublisherDemandInsightsService?wsdl', 'UserCredentials', $head_param); 

    // Prepare Soap Client 
    $soapClient->__setSoapHeaders(array($headers)); 

    try {
        $info = $soapClient->getPublisherAdTagReport(new SoapParam($access_token,"accessToken"),new SoapParam($pubId,"publisherId"),new SoapParam("2015-10-01","fromDate"),new SoapParam("2015-10-30","toDate")); 
        print_r($info);
    } catch (SoapFault $fault) { 
        print_r($fault); 
    } 

SoapFault object returned in the exception goes like this:

    SoapFault Object
    (
        [message:protected] => Apigee Internal Error
        [string:Exception:private] => 
        [code:protected] => 0
        [file:protected] => /home/utkarsh/algoscale/soapTest.php
        [line:protected] => 62
        [trace:Exception:private] => Array
            (
                [0] => Array
                    (
                        [function] => __doRequest
                        [class] => SoapClient
                        [type] => ->
                        [args] => Array
                            (
                                [0] => <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://webservices.reporting.core.pubmatic.com/" xmlns:ns2="http://beta-api.pubmatic.com/v1/PublisherDemandInsightsService?wsdl"><SOAP-ENV:Header><ns2:UserCredentials><item><key>Authorization</key><value>Bearer #######AccessToken######</value></item></ns2:UserCredentials></SOAP-ENV:Header><SOAP-ENV:Body><ns1:getPublisherAdTagReport/><publisherId>####3</publisherId><fromDate>2015-10-01</fromDate><toDate>2015-10-30</toDate></SOAP-ENV:Body></SOAP-ENV:Envelope>

                                [1] => http://beta-api.pubmatic.com/v1/PublisherDemandInsightsService
                                [2] => 
                                [3] => 1
                                [4] => 0
                            )

                    )

                [1] => Array
                    (
                        [file] => /home/utkarsh/algoscale/soapTest.php
                        [line] => 62
                        [function] => __call
                        [class] => SoapClient
                        [type] => ->
                        [args] => Array
                            (
                                [0] => getPublisherAdTagReport
                                [1] => Array
                                    (
                                        [0] => SoapParam Object
                                            (
                                                [param_name] => accessToken
                                                [param_data] => #######AccessToken######
                                            )

                                        [1] => SoapParam Object
                                            (
                                                [param_name] => publisherId
                                                [param_data] => ####3
                                            )

                                        [2] => SoapParam Object
                                            (
                                                [param_name] => fromDate
                                                [param_data] => 2015-10-01
                                            )

                                        [3] => SoapParam Object
                                            (
                                                [param_name] => toDate
                                                [param_data] => 2015-10-30
                                            )

                                    )

                            )

                    )

                [2] => Array
                    (
                        [file] => /home/utkarsh/algoscale/soapTest.php
                        [line] => 62
                        [function] => getPublisherAdTagReport
                        [class] => SoapClient
                        [type] => ->
                        [args] => Array
                            (
                                [0] => SoapParam Object
                                    (
                                        [param_name] => accessToken
                                        [param_data] => #######AccessToken######
                                    )

                                [1] => SoapParam Object
                                    (
                                        [param_name] => publisherId
                                        [param_data] => ####3
                                    )

                                [2] => SoapParam Object
                                    (
                                        [param_name] => fromDate
                                        [param_data] => 2015-10-01
                                    )

                                [3] => SoapParam Object
                                    (
                                        [param_name] => toDate
                                        [param_data] => 2015-10-30
                                    )

                            )

                    )

            )

        [previous:Exception:private] => 
        [faultstring] => Apigee Internal Error
        [faultcode] => HTTP
    )

Here is the struct that I got using: $soapClient->__getTypes()

    [8] => struct getPublisherAdTagReport {
        string accessToken;
        long publisherId;
        string fromDate;
        string toDate;
        reportingOptionalParams reportingOptionalParams;
    }

And the function getPublisherAdTagReport() as per $soapClient->__getFunctions() goes like this:

    [2] => getPublisherAdTagReportResponse getPublisherAdTagReport(getPublisherAdTagReport $parameters)

Solution

  • This is what worked for me in the above issue:

    // form an array listing the http header
    $httpHeaders = array(
        'http' => array(
            'protocol_version' => 1.1,
            'header' => "Authorization:Bearer " . $access_token . "\r\n",
        ));
    // form a stream context
    $context = stream_context_create($httpHeaders);
    // pass it in an array
    $params = array('stream_context' => $context);
    $client = new SoapClient("http://beta-api.pubmatic.com/v1/PublisherDemandInsightsService?wsdl",
        $params);
    // access the remote method using the client object
    $result = $client->getPublisherAdTagReport(array('accessToken' => $access_token, 'publisherId' => $pubId,
                        'fromDate' => $startdate, 'toDate' => $enddate));