PHP通过WSDL URL

时间:2018-01-30 12:20:20

标签: php web-services soap wsdl workday-api

我正在尝试调用已经给出了WSDL文件的SOAP webservice。我可以通过SOAP UI或Chrome Boomerang测试这些SOAP请求和响应。我能够得到正确的答复。

客户已共享WSDL URL,用户名和密码。 如何使用PHP代码来调用服务。我担心的是我有XML格式的请求和响应。

我可以直接在请求中发送XML吗?如何使用这些给定的XML-Request信息创建SOAP请求。我是否需要解析对象或数组。提前谢谢。

在SOAP UI上向我发送响应的XML请求是 -

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
    xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <env:Header>
        <xsd:sample_Common_Header>
            <xsd:Include_Reference_Descriptors_In_Response>false</xsd:Include_Reference_Descriptors_In_Response>
        </xsd:sample_Common_Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:UsernameToken>
                <wsse:Username>Assessment@tenant</wsse:Username>
                <wsse:Password>Test@1234</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
    </env:Header>
    <env:Body>
        <wd:Get_Assess_Candidate_Request
            xmlns:wd="urn:com.sample/bsvc"
            wd:version="v29.0">
              <wd:Request_Criteria>
<wd:Candidate_Criteria_Data>
<wd:Candidate_Reference>
<wd:ID wd:type="Candidate_ID">C0000417</wd:ID>
</wd:Candidate_Reference>
</wd:Candidate_Criteria_Data>
 </wd:Request_Criteria>
 <wd:Response_Filter>
                <wd:As_Of_Effective_Date>2018-01-16</wd:As_Of_Effective_Date>
                <wd:As_Of_Entry_DateTime>2018-01-16T11:17:34</wd:As_Of_Entry_DateTime>
                <wd:Page>1</wd:Page>
                <wd:Count>100</wd:Count>
            </wd:Response_Filter>
        </wd:Get_Assess_Candidate_Request>
    </env:Body>
</env:Envelope>

2 个答案:

答案 0 :(得分:0)

您可以使用curl发送XML字符串,但我不建议这样做。

我的建议是使用WSDL到PHP生成器,例如PackageGenerator项目。使用生成的SDK可以避免您想知道如何构造请求。此外,响应将得到很好的处理,您最终将采用完整的OOP方法。

答案 1 :(得分:0)

function AddWSSUsernameToken($client, $username, $password)
{
    $wssNamespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";

    $username = new SoapVar($username, 
                            XSD_STRING, 
                            null, null, 
                            'Username', 
                            $wssNamespace);

    $password = new SoapVar($password, 
                            XSD_STRING, 
                            null, null, 
                            'Password', 
                            $wssNamespace);

    $usernameToken = new SoapVar(array($username, $password), 
                                    SOAP_ENC_OBJECT, 
                                    null, null, 'UsernameToken', 
                                    $wssNamespace);

    $usernameToken = new SoapVar(array($usernameToken), 
                            SOAP_ENC_OBJECT, 
                            null, null, null, 
                            $wssNamespace);

    $wssUsernameTokenHeader = new SoapHeader($wssNamespace, 'Security', $usernameToken);

    $client->__setSoapHeaders($wssUsernameTokenHeader);
}

function get_soap_client(){


    $username = 'Assessment@tenant';
    $password = 'Test@1234';
    $wsdl = 'https://wd5-impl-
    services1.workday.com/ccx/service/tenant/Recruiting/v29.1?wsdl';

    $options = array(
            'uri'=>'http://schemas.xmlsoap.org/soap/envelope/',
            'style'=>SOAP_RPC,
            'use'=>SOAP_ENCODED,
            'soap_version'=>SOAP_1_1,
            'cache_wsdl'=>WSDL_CACHE_NONE,
            'connection_timeout'=>15,
            'trace'=>true,
            'encoding'=>'UTF-8',
            'exceptions'=>true,
    );


    $client = new SoapClient($wsdl, $options);
    AddWSSUsernameToken($client, $username, $password);

    return $client;    

}


try
    {

        $params = array(); //define your parameters here
        $client = get_soap_client();
        $response = $client->__soapCall('method-name',$params);

    }
    catch(Exception $e){ 
        echo $e->getCode(). '<br />'. $e->getMessage();

    }