2016-10-14 3 views
5

nusoapを使用して簡単なWebサービスを実装しようとしています。 サーバー:Nusoap "SOAP-ENV:Xmlが空であり、解析されませんでした"メッセージ

<?php 
require_once "nusoaplib/nusoap.php"; 

class food { 

    public function getFood($type) { 
     switch ($type) { 
      case 'starter': 
       return 'Soup'; 
       break; 
      case 'Main': 
       return 'Curry'; 
       break; 
      case 'Desert': 
       return 'Ice Cream'; 
       break; 
      default: 
       break; 
     } 
    } 
} 

$server = new soap_server(); 
$server->configureWSDL("foodservice", "urn:foodservice"); 

$server->register("food.getFood", 
    array("type" => "xsd:string"), 
    array("return" => "xsd:string"), 
    "urn:foodservice", 
    "urn:foodservice#getFood", 
    "rpc", 
    "encoded", 
    "Get food by type"); 

@$server->service($HTTP_RAW_POST_DATA); 
?> 

クライアント:

<?php 
require_once "nusoaplib/nusoap.php"; 

$client = new nusoap_client("http://localhost/SOAPServer.php?wsdl", true); 
$error = $client->getError(); 

if ($error) { 
    echo "<h2>Constructor error</h2><pre>" . $error . "</pre>"; 
} 

$result = $client->call("food.getFood", array("type" => "Main")); 

if ($client->fault) { 
    echo "<h2>Fault</h2><pre>"; 
    print_r($result); 
    echo "</pre>"; 
} else { 
    $error = $client->getError(); 
    if ($error) { 
     echo "<h2>Error</h2><pre>" . $error . "</pre>"; 
    } else { 
     echo "<h2>Main</h2>"; 
     echo $result; 
    } 
} 

// show soap request and response 
echo "<h2>Request</h2>"; 
echo "<pre>" . htmlspecialchars($client->request, ENT_QUOTES) . "</pre>"; 
echo "<h2>Response</h2>"; 
echo "<pre>" . htmlspecialchars($client->response, ENT_QUOTES) . "</pre>"; 
?> 

WSDLファイルは、次のされ、nusoapによって生成されます。

<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:foodservice" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:foodservice"> 
<types> 
<xsd:schema targetNamespace="urn:foodservice"> 
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> 
<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/"/> 
</xsd:schema> 
</types> 
<message name="food.getFoodRequest"> 
<part name="type" type="xsd:string"/> 
</message> 
<message name="food.getFoodResponse"> 
<part name="return" type="xsd:string"/> 
</message> 
<portType name="foodservicePortType"> 
<operation name="food.getFood"> 
<documentation>Get food by type</documentation> 
<input message="tns:food.getFoodRequest"/> 
<output message="tns:food.getFoodResponse"/> 
</operation> 
</portType> 
<binding name="foodserviceBinding" type="tns:foodservicePortType"> 
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> 
<operation name="food.getFood"> 
<soap:operation soapAction="urn:foodservice#getFood" style="rpc"/> 
<input> 
<soap:body use="encoded" namespace="urn:foodservice" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
</input> 
<output> 
<soap:body use="encoded" namespace="urn:foodservice" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
</output> 
</operation> 
</binding> 
<service name="foodservice"> 
<port name="foodservicePort" binding="tns:foodserviceBinding"> 
<soap:address location="http://10.152.128.39/SOAPServer.php"/> 
</port> 
</service> 
</definitions> 

サーバファイルおよびWSDLファイルの両方にアクセスして、両方とも動作しますが、クライアントにアクセスしようとするとエラーメッセージが表示されます。

[faultcode] => SOAP-ENV:Client 
    [faultactor] => 
    [faultstring] => error in msg parsing: 
xml was empty, didn't parse! 
    [detail] => 

何が問題なのですか?

答えて

13

あなたのヌードに。サーバーあなたは変更する必要があります。

をこの:このため

@$server->service($HTTP_RAW_POST_DATA); 

@$server->service(file_get_contents("php://input"));

あなたは通知や警告をチェックしたい場合は、@を削除することがあります。

http://php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data

この機能のいくつかの説明は、PHP 5.6.0で非推奨とPHP 7.0.0で削除されました。 TRUEに設定すると、PHPは生のPOSTデータを含む$ HTTP_RAW_POST_DATAに常に値を設定します。それ以外の場合は、データのMIMEタイプが認識されない場合にのみ、変数に値が設定されます。

生のPOSTデータにアクセスするための優先メソッドは、PHP 5.6.0以降ではphp:// inputで、$ HTTP_RAW_POST_DATAは非推奨です。 always_populate_raw_post_dataを-1に設定すると、PHPの将来のバージョンで実装される新しい動作が選択されます。この動作では、$ HTTP_RAW_POST_DATAは決して定義されません。

設定に関係なく、$ HTTP_RAW_POST_DATAはenctype = "multipart/form-data"では使用できません。

+0

Both @ $ server-> service(file_get_contents( "php:// input"));を試してみました。しかし働かなかった。その後、php.iniをalways_populate_raw_post_dataに設定した方法を1に変更しても動作しません。誰でも私を助けることができます。 –

+0

@ $ server-> service(file_get_contents( "php:// input")); @ BantyRoy私はあなたのクライアント/サーバーのペアをダウンロードしてテストして、うまくいくように思えます(私はカレーを取得します)。あなたのサーバー上で何らかの設定ミスがあったり、バージョンなどの問題が発生しているようです。 – erm3nda

+0

ありがとう、私は完全にPHP 7.0で動作し、3時間のバグが修正されました:) –

関連する問題