Не удалось создать мой первый SOAP-сервис в php - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь создать свой первый веб-сервер SOAP, но мне не удалось. Я пробовал несколько учебных пособий, но ни одно из них не работает. Ниже приведено то, что я пробовал до сих пор:

Серверный скрипт:

require_once "lib/nusoap.php";

function getProd($category) {
    if ($category == "books") {
        return join(",", array(
            "The WordPress Anthology",
            "PHP Master: Write Cutting Edge Code",
            "Build Your Own Website the Right Way"));
    }
    else {
            return "No products listed under that category";
    }
}

$server = new soap_server();
$server->soap_defencoding = 'utf-8';
$server->register("getProd");
$server->service($HTTP_RAW_POST_DATA);

Клиентский скрипт:

<code>require_once "lib/nusoap.php";

$client = new nusoap_client("https://mydomain/soap_server.php");
$client->soap_defencoding = 'utf-8';

$error = $client->getError();
if ($error) {
    echo "<h2>Constructor error</h2><pre>" . $error . "
"; } $ result = $ client-> call ("getProd", array ("category" => "books")); if ($ client-> fault) { echo "

Fault

";
    print_r($result);
    echo "
"; } еще { $ error = $ client-> getError (); if ($ error) { echo "

Error

" . $error . "
"; } еще { echo "

Books

";
        echo $result;
        echo "
"; } } echo '

Запрос

' . htmlspecialchars($client->request, ENT_QUOTES) . '
'; echo '

Response

' . htmlspecialchars($client->response, ENT_QUOTES) . '
'; echo '

Debug

' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '
';

Когда я звоню на мою страницу https://mydomain/soap_client.php я получаю

Fault

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

Запрос

POST /dss/soap_server.php HTTP/1.0
Host: mydomain
User-Agent: NuSOAP/0.9.5 (1.123)
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Content-Length: 507

<?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 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/"><SOAP-ENV:Body><ns9471:getProd xmlns:ns9471="http://tempuri.org"><category xsi:type="xsd:string">books</category></ns9471:getProd></SOAP-ENV:Body></SOAP-ENV:Envelope>

Ответ

HTTP/1.1 500 Internal Server Error
Server: nginx
Date: Sun, 26 Aug 2018 07:49:26 GMT
Content-Type: text/xml; charset=utf-8
Content-Length: 684
Connection: keep-alive
X-SOAP-Server: NuSOAP/0.9.5 (1.123)

<?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
  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/">
<SOAP-ENV:Body><SOAP-ENV:Fault><faultcode xsi:type="xsd:string">SOAP-ENV:Client</faultcode><faultactor xsi:type="xsd:string"></faultactor><faultstring xsi:type="xsd:string">error in msg parsing:
xml was empty, didn&apos;t parse!</faultstring><detail xsi:type="xsd:string"></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>

Я также могу предоставить htmlspecialchars($client->debug_str, ENT_QUOTES) при необходимости.

Не могли бы вы помочь мне найти способ решения проблемы? Любая помощь будет оценена. Спасибо.

1 Ответ

0 голосов
/ 26 августа 2018

Как уже указывал Магнус Эрикссон - я бы в любом случае использовал встроенную в PHP реализацию

В вашем случае это выглядит довольно просто (я обернул вашу функцию в класс с именем Book)

Сервер

try
{
    $objSoapServer = new SoapServer(null, ['uri' => 'http://localhost/soap/server.php']);
    $objSoapServer->setClass('Book');
    $objSoapServer->handle();
}
catch(SoapFault $e)
{
    echo $e->getMessage();
}

class Book
{
    public function getBooks($category)
    {
        if ($category == "books") {
            return join(",", array(
                "The WordPress Anthology",
                "PHP Master: Write Cutting Edge Code",
                "Build Your Own Website the Right Way"));
        }
        else {
            return "No products listed under that category";
        }
    }
}

Клиент

$client = new SoapClient(null, [
    'location' => "http://localhost/soap/server.php",
    'uri'      => "http://localhost/soap/server.php",
    'trace'    => 1 ]
);

echo $client->__soapCall("getBooks",["books"]);

Для получения дополнительной информации ознакомьтесь с официальной документацией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...