NuSOAP: как изменить контент-тип запроса? - PullRequest
4 голосов
/ 03 июня 2009

При использовании веб-службы .NET WCF я получаю следующий ответ (ошибка):

Неподдерживаемый статус ответа HTTP 415 Невозможно обработать сообщение, потому что тип содержимого 'text / xml; кодировка = UTF-8' не был ожидаемый тип 'application / soap + xml; кодировка = UTF-8' .

Как мне изменить тип контента? Я не могу найти его на форумах / документах NuSOAP, или я что-то упускаю из виду ...

Ответы [ 5 ]

9 голосов
/ 06 ноября 2009

я знаю, что это старая запись, но я побежал на эту страницу в поисках ответа.

application/soap+xml - тип содержимого, передаваемый при использовании SOAP 1.2, text/xml используется с SOAP 1.1,

что-то вроде этого должно сработать,

$client = new SoapClient("some.wsdl", array('soap_version' => SOAP_1_1));
3 голосов
/ 23 ноября 2011

Вы можете указать кодировку потоков NuSOAP с помощью таких веб-сервисов:

$client = new nusoap_client($params);
$client->soap_defencoding = 'UTF-8';
2 голосов
/ 16 февраля 2010

Похоже, в библиотеке NuSOAP есть небольшое упущение ... предполагается, что заголовки содержимого ДОЛЖНЫ быть "text / xml", поэтому, если ваш клиент пытается подключиться к службе, которая выводит заголовки application / soap + xml вы получите ошибки типа:

Ответ не имеет типа text / xml: application / soap + xml; кодировка = UTF-8

Чтобы проверить это, вы можете воспользоваться следующим небольшим шаблоном функции, который я использовал для входа в службу SOAP. Помните, распечатайте объект клиента! На самом деле вы не можете получить результат, чтобы посмотреть!

require_once('path/to/downloaded/libraries/nusoap.php');    
var $endpoint = 'https://somedomain.com/path/to/soap/server/Login';
var $client; // the soapclient object

function SOAP_Login()
{
    $this->client = new soapclient($this->endpoint);

    $err = $this->client->getError();
    if ($err) 
    {
        // Display the error
        echo '<p><b>SOAP Constructor error: ' . $err . '</b></p>';
        exit;
        // At this point, you know the call that follows will fail
    }

    $params = array( 
        'some' => 'thing.. depends on what the WSDL expects'
    );

    $result = $this->client->call('someFunction', $params);     

    print_r($result);  // Without the fix, this prints nothing (i.e. false) !!!

    print_r($this->client); // Instead, look at the state of the client object, specifically error_str and debug_str
}

Когда я печатал свой результат $, я ничего не получал, но когда я печатал объект $ client, я мог видеть, что были ошибки.

Небольшой хак, который я реализовал, был в файле nusoap.php, около строки 7500. Ищите этот оператор if:

if (!strstr($headers['content-type'], 'text/xml')) {
    $this->setError('Response not of type text/xml: ' . $headers['content-type']);
    return false;
}

И измените это на:

if (!strstr($headers['content-type'], 'text/xml') && !strstr($headers['content-type'], 'application/soap+xml') ) {
    $this->setError('Response not of type text/xml: ' . $headers['content-type']);
    return false;
}

Все, что он делает, это позволяет NuSOAP обрабатывать ответы, которые выдают заголовок «application / soap + xml» (который является действительным заголовком xml).

0 голосов
/ 23 января 2014

Это сработало для меня:

$ client = new nusoap_client ($ params);

$ client-> soap_defencoding = 'UTF-8';

Ответ, помеченный как правильный, не предназначен для NUSOAP, поэтому не является правильным ответом.

0 голосов
/ 04 июня 2009

Я тоже застрял на этом.

Секрет в web.config Измените wsHttpBinding на basicHttpBinding

Вот так:

<endpoint address="" binding="basicHttpBinding" contract="YourProject.View.Whatever.IYourService">

Надеюсь, это поможет! / Erik

...