简体   繁体   English

如何使用 PHP Soap 类客户端进行 SoapCall

[英]How do you make a SoapCall using the PHP Soap class client

I am attempting to make a SOAP call in PHP using the PHP Soap Client class.我正在尝试使用 PHP Soap Client 类在 PHP 中进行 SOAP 调用。 I managed to connect to the WDSL file however it isn't accepting my parameters.我设法连接到 WDSL 文件,但它不接受我的参数。 Here are all the necessary information needed for this call.以下是此次通话所需的所有必要信息。 When I enter the following:当我输入以下内容时:

    $wsdlUrl = 'https://irm.cooperboating.com/rdpwincentralsvc/irmpublic.asmx?WSDL';
    $client = new SoapClient($wsdlUrl);
    var_dump($client->__getFunctions());
    var_dump($client->__getTypes());

I get:我得到:

  // Output from getFunctions()
  [26]=>
  string(83) "GetCourseInformationResponse GetCourseInformation(GetCourseInformation $parameters)"

  // Output from getTypes()
  [117]=>
  string(63) "struct GetCourseInformation {
     GetCourseInformation_irmRQ RQ;
  }"
  [118]=>
  string(152) "struct GetCourseInformation_irmRQ {
     irmWebSvcCredentials Credentials;
     string CourseNumber;
     string CourseID;
     dateTime StartDate;
     dateTime EndDate;
  }"
  [4]=>
  string(104) "struct irmWebSvcCredentials {
     string LogonID;
     string Password;
     string DataPath;
     string DatabaseID;
  }"

After reading the answer from: How to make a PHP SOAP call using the SoapClient class I have attempted the following:在阅读以下答案后: How to make a PHP SOAP call using the SoapClient class我尝试了以下操作:


class irmWebSvcCredentials {

    public function __construct() {
        $this->LogonID = "SomeLogin";
        $this->Password = "SomPass";
        $this->DataPath = "SomePath";
        $this->DatabaseID = "SomeId";
    }
}

try {

    $wsdlUrl = 'https://irm.cooperboating.com/rdpwincentralsvc/irmpublic.asmx?WSDL';
    $client = new SoapClient($wsdlUrl);
    $credentials = new irmWebSvcCredentials();
    $params = array(
        "Credentials" => $credentials,
        "CourseNumber" => "",
        "CourseID" => "",
        "StartDate" => "2019-12-05T18:13:00",
        "EndDate" => "2025-12-29T18:13:00",
    );

    $response = $client->GetCourseInformation(array($params));
    var_dump($response);

}
catch(Exception $e) {
    echo $e->getMessage();
}

I've also tried inputting "Credentials" as just an array instead of a class as some other answers have suggested like so:我还尝试将“凭据”作为数组而不是类输入,因为其他一些答案建议如下:

    $params = array(
        "Credentials" => array(
            "LogonID" => "SomeLogin",
            "Password" => "SomPass",
            "DataPath" => "SomePath",
            "DatabaseID" => "SomeId",
        ),
        "CourseNumber" => "",
        "CourseID" => "",
        "StartDate" => "2019-12-05T18:13:00",
        "EndDate" => "2025-12-29T18:13:00",
    );

It doesn't seem to matter what I input for the parameters when I call $client->GetCourseInformation, as long as I provide a parameter in the structure of an array it always gives me the same output which is:当我调用 $client->GetCourseInformation 时,我为参数输入什么似乎并不重要,只要我在数组结构中提供一个参数,它总是给我相同的输出,即:

object(stdClass)#3 (1) {
  ["GetCourseInformationResult"]=>
  object(stdClass)#4 (3) {
    ["Status"]=>
    int(1)
    ["ErrMsg"]=>
    string(47) "GetCourseInformation_irmRQ is not instantiated."
...

Using Postman I've been able to get the expected output so that leads me to believe that I am not providing a certain parameter.使用 Postman 我已经能够获得预期的输出,这让我相信我没有提供某个参数。 Lastly here is the body I provide in Postman to get the expected output with content type being text/xml:最后,这是我在 Postman 中提供的正文,用于获取内容类型为 text/xml 的预期输出:

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetCourseInformation xmlns="http://someurl.com/irmpublic">
      <RQ>
        <Credentials>
         <LogonID>SomeLogin</LogonID>
         <Password>SomPass</Password>
         <DataPath>SomePath</DataPath>
         <DatabaseID>SomeId</DatabaseID>
       </Credentials>
        <CourseNumber></CourseNumber>
        <CourseID></CourseID>
        <StartDate>2019-12-20T18:13:00</StartDate>
        <EndDate>2025-12-29T18:13:00</EndDate>
      </RQ>
    </GetCourseInformation>
  </soap:Body>
</soap:Envelope>

Is there something I'm not providing?有什么我没有提供的吗? Or does this problem have something to do with the API itself?还是这个问题与API本身有关?

This question has been solved.这个问题已经解决了。 The answer was in the body provided in Postman.答案就在 Postman 中提供的正文中。

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetCourseInformation xmlns="http://someurl.com/irmpublic">
      <RQ>           <----- Notice the RQ here
        <Credentials>
         <LogonID>SomeLogin</LogonID>
         <Password>SomPass</Password>
         <DataPath>SomePath</DataPath>
         <DatabaseID>SomeId</DatabaseID>
       </Credentials>
        <CourseNumber></CourseNumber>
        <CourseID></CourseID>
        <StartDate>2019-12-20T18:13:00</StartDate>
        <EndDate>2025-12-29T18:13:00</EndDate>
      </RQ>
    </GetCourseInformation>
  </soap:Body>
</soap:Envelope>

The RQ was never provided so it didn't know how to read the provided parameter.从未提供 RQ,因此它不知道如何读取提供的参数。 To fix this we simply have to change this:为了解决这个问题,我们只需要改变这个:

    $params = array(
        "Credentials" => array(
            "LogonID" => "SomeLogin",
            "Password" => "SomPass",
            "DataPath" => "SomePath",
            "DatabaseID" => "SomeId",
        ),
        "CourseNumber" => "",
        "CourseID" => "",
        "StartDate" => "2019-12-05T18:13:00",
        "EndDate" => "2025-12-29T18:13:00",
    );

To this:对此:

    $params = array(
        "RQ" => array(
            "Credentials" => array(
                "LogonID" => "SomeLogin",
                "Password" => "SomPass",
                "DataPath" => "SomePath",
                "DatabaseID" => "SomeId",
            ),
            "CourseNumber" => "",
            "CourseID" => "",
            "StartDate" => "2019-12-05T18:13:00",
            "EndDate" => "2025-12-29T18:13:00",
        )
    );

This was a very specific question but I hope this helps someone in the future.这是一个非常具体的问题,但我希望这对将来的人有所帮助。

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

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