PHP - SOAP 请求 | XML/WSDL
PHP - SOAP Request | XML/WSDL
我正在寻找一种从 PHP 代码发送 SOAP 请求的方法。一个名为 MovieStarPlanet 的在线游戏 "library" 包含许多 SOAP 请求。
这里是所有查询的link:
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>
当 username/password 组合正确时,会提示很多帐户信息。
我做了很多研究,但我不知道如何应用代码。这是我所做的:
$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.';
}
当我运行代码时,它告诉我一个错误:"Operation timed out after 10000 milliseconds with 0 bytes received"。
谁能帮帮我?
您正在 curl 调用中连接到 wsdl 文件。 (
$url = "http://www.moviestarplanet.fr/WebService/ThirdParty/ThirdPartyService.asmx?WSDL")
wsdl 不是网络服务,wsdl 是一个 xml 文件,其中包含对网络服务的描述。
代替使用 curl 进行所有低级编码,您可以使用 SoapClient class:
$client=new SoapClient('http://www.moviestarplanet.fr/WebService/ThirdParty/ThirdPartyService.asmx?WSDL');
这样,与 web 服务的许多基本通信都是自动处理的。
例如,您可以首先列出网站上的所有服务:
print_r($client->__getFunctions());
我找到解决办法了! :)
<?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);
?>
我正在寻找一种从 PHP 代码发送 SOAP 请求的方法。一个名为 MovieStarPlanet 的在线游戏 "library" 包含许多 SOAP 请求。
这里是所有查询的link:
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>
当 username/password 组合正确时,会提示很多帐户信息。
我做了很多研究,但我不知道如何应用代码。这是我所做的:
$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.';
}
当我运行代码时,它告诉我一个错误:"Operation timed out after 10000 milliseconds with 0 bytes received"。
谁能帮帮我?
您正在 curl 调用中连接到 wsdl 文件。 ( $url = "http://www.moviestarplanet.fr/WebService/ThirdParty/ThirdPartyService.asmx?WSDL")
wsdl 不是网络服务,wsdl 是一个 xml 文件,其中包含对网络服务的描述。
代替使用 curl 进行所有低级编码,您可以使用 SoapClient class:
$client=new SoapClient('http://www.moviestarplanet.fr/WebService/ThirdParty/ThirdPartyService.asmx?WSDL');
这样,与 web 服务的许多基本通信都是自动处理的。
例如,您可以首先列出网站上的所有服务:
print_r($client->__getFunctions());
我找到解决办法了! :)
<?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);
?>