【问题标题】:PHP - SOAP Request | XML/WSDLPHP - SOAP 请求 | XML/WSDL
【发布时间】:2017-01-17 21:02:42
【问题描述】:

我正在寻找一种从 PHP 代码发送 SOAP 请求的方法。一个名为 MovieStarPlanet 的在线游戏有一个包含许多 SOAP 请求的“库”。

这里是所有查询的链接:

WSDL 描述:

查询是这样的:

POST /WebService/ThirdParty/ThirdPartyService.asmx HTTP/1.1
Host: http://www.moviestarplanet.fr
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://moviestarplanet.com/Login"

<?xml version="1.0" encoding="utf-8"?>
<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:Header>
    <ThirdPartyTokenHeader xmlns="http://moviestarplanet.com/">
      <ThirdPartyToken>string</ThirdPartyToken>
    </ThirdPartyTokenHeader>
  </soap:Header>
  <soap:Body>
    <Login xmlns="http://moviestarplanet.com/">
      <username>string</username>
      <password>string</password>
    </Login>
  </soap:Body>
</soap:Envelope>

这个查询的答案是:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<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:Header>
    <ThirdPartyTicketHeader xmlns="http://moviestarplanet.com/">
      <Ticket>string</Ticket>
    </ThirdPartyTicketHeader>
  </soap:Header>
  <soap:Body>
    <LoginResponse xmlns="http://moviestarplanet.com/">
      <LoginResult>
        <ServiceResult>
          <Codee>int</Codee>
          <Description>string</Description>
        </ServiceResult>
        <ActorId>int</ActorId>
        <AppToken>string</AppToken>
        <UserInfo>
          <FriendCount>int</FriendCount>
          <MembershipTimeoutDate>dateTime</MembershipTimeoutDate>
          <VipTier>int</VipTier>
          <Level>int</Level>
          <LockedUntil>dateTime</LockedUntil>
          <LockedText>string</LockedText>
          <SkinSWF>string</SkinSWF>
          <LastLogin>dateTime</LastLogin>
        </UserInfo>
      </LoginResult>
    </LoginResponse>
  </soap:Body>
</soap:Envelope>

当用户名/密码组合正确时,这将提示大量帐户信息。

我做了很多研究,但我不知道如何应用代码。这是我所做的:

$soap_request  = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
$soap_request .= "<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/\">\n";
$soap_request .= "  <soap:Header>\n";
$soap_request .= "    <ThirdPartyTokenHeader xmlns=\"http://moviestarplanet.com/\">\n";
$soap_request .= "      <ThirdPartyToken>8346D304-F85E-4dc1-98EB-033CBEE0217F</ThirdPartyToken>\n";
$soap_request .= "    </ThirdPartyTokenHeader>\n";
$soap_request .= "  </soap:Header>\n";
$soap_request .= "  <soap:Body>\n";
$soap_request .= "    <Login xmlns=\"http://moviestarplanet.com/\">\n";
$soap_request .= "      <username>string</username>\n";
$soap_request .= "      <password>string</password>\n";
$soap_request .= "    </Login>\n";
$soap_request .= "  </soap:Body>\n";
$soap_request .= "</soap:Envelope>";

$header = array(
  "POST /WebService/ThirdParty/ThirdPartyService.asmx HTTP/1.1",
  "Host: http://www.moviestarplanet.fr",
  "Content-type: text/xml; charset=utf-8",
  "Content-length: ".strlen($soap_request),
  "SOAPAction: \"http://moviestarplanet.com/Login\"",
);

$url = "http://www.moviestarplanet.fr/WebService/ThirdParty/ThirdPartyService.asmx?WSDL";

$soap_do = curl_init();
curl_setopt($soap_do, CURLOPT_URL, $url);
curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($soap_do, CURLOPT_TIMEOUT,        10);
curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, true );
curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($soap_do, CURLOPT_POST,           true );
curl_setopt($soap_do, CURLOPT_POSTFIELDS,     $soap_request);
curl_setopt($soap_do, CURLOPT_HTTPHEADER,     $header);

if(curl_exec($soap_do) === false) {
  $err = 'Curl error: ' . curl_error($soap_do);
  curl_close($soap_do);
  print $err;
} else {
  curl_close($soap_do);
  print 'Success.';
}

当我运行代码时,它告诉我一个错误:“操作在 10000 毫秒后超时,收到 0 个字节”。

谁能帮帮我?

【问题讨论】:

    标签: php xml wsdl


    【解决方案1】:

    我找到了解决方案! :)

    <?php
    $xml_data = '
    <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:Header>
        <ThirdPartyTokenHeader xmlns="http://moviestarplanet.com/">
          <ThirdPartyToken>8346D304-F85E-4dc1-98EB-033CBEE0217F</ThirdPartyToken>
        </ThirdPartyTokenHeader>
      </soap:Header>
      <soap:Body>
        <Login xmlns="http://moviestarplanet.com/">
          <username>USER</username>
          <password>PASS</password>
        </Login>
      </soap:Body>
    </soap:Envelope>
    ';
    
    $headers = array(
    "POST /WebService/ThirdParty/ThirdPartyService.asmx HTTP/1.1",
    "Referer: www.moviestarplanet.fr",
    "User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.4.2; GT-I9505 Build/KOT49H)",
    "Content-Type: text/xml; charset=utf-8",
    "Host: www.moviestarplanet.fr",
    "Content-length: ".strlen($xml_data),
    "Expect: 100-continue"
    );
    
    $url = 'http://www.moviestarplanet.fr/WebService/ThirdParty/ThirdPartyService.asmx?WSDL';
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);
    
    $reply = curl_exec($ch); 
    
    echo($reply);
    ?>
    

    【讨论】:

      【解决方案2】:

      您正在 curl 调用中连接到 wsdl 文件。 ( $url = "http://www.moviestarplanet.fr/WebService/ThirdParty/ThirdPartyService.asmx?WSDL")

      wsdl 不是 web 服务,wsdl 是一个带有 web 服务描述的 xml 文件。

      想要使用 curl 进行所有低级编码,您可以使用 SoapClient 类:

      $client=new SoapClient('http://www.moviestarplanet.fr/WebService/ThirdParty/ThirdPartyService.asmx?WSDL');
      

      这样,与 web 服务的许多基本通信都是自动处理的。

      例如,您可以从列出站点上的所有服务开始:

      print_r($client->__getFunctions());
      

      【讨论】:

      • 非常感谢您的回答,@Kurt Larsen。当我执行此行代码时:$client=new SoapClient('http://www.moviestarplanet.fr/WebService/ThirdParty/ThirdPartyService.asmx?WSDL'); 它给了我一个错误:致命错误:SOAP-ERROR: Parsing WSDL: Couldn't load from 'moviestarplanet.fr/WebService/ThirdParty/…' : failed to load external entity "moviestarplanet.fr/WebService/ThirdParty/…" 你知道为什么吗?谢谢。
      • @Pierre-Louis:我不知道。刚刚测试了一下,同样的错误。尝试了here 提到的一些解决方案,但没有成功。当我在 SoapUI 和 Boomerang 中测试时,一切都可以正常工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多