Nusoap "SOAP-ENV: Xml был пуст, не проанализирован" Сообщение

Я пытаюсь реализовать простой веб-сервис, используя nusoap. Сервер:

<?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] => 

Любые предложения, в чем может быть проблема?

1 ответ

В твоем nusoap. Сервер вы должны изменить:

Это:

@$server->service($HTTP_RAW_POST_DATA);

за это:

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

Вы можете удалить @, если хотите проверить уведомления и предупреждения.

Некоторое объяснение от http://php.net/manual/en/ini.core.php

Эта функция УСТАРЕЛА в PHP 5.6.0 и УДАЛЕНА с PHP 7.0.0. Если установлено значение TRUE, PHP всегда будет заполнять $HTTP_RAW_POST_DATA, содержащий необработанные данные POST. В противном случае переменная заполняется только тогда, когда MIME-тип данных не распознается.

Предпочтительным методом доступа к необработанным данным POST является php://input, а $HTTP_RAW_POST_DATA устарела в PHP 5.6.0 и выше. Если для параметра Always_populate_raw_post_data задано значение -1, будет выбрано новое поведение, которое будет реализовано в будущей версии PHP, в которой $HTTP_RAW_POST_DATA никогда не определяется.

Независимо от настройки $HTTP_RAW_POST_DATA недоступен с enctype="multipart/form-data".

Другие вопросы по тегам