2016-05-13 6 views
2

Мне нужно взаимодействовать с SOAP-сервером, который будет принимать только HTTP-запросы GET (использование POST приводит к ошибке «плохого запроса»).Заставить PHP SoapClient использовать HTTP GET-запрос

Я не смог найти что-либо в документации документации PHP о том, как на это так хватаются за соломинку, я попытался установить заголовок запроса с использованием stream_context

$soap_client = new SoapClient($wsdl, 
     array(
      "trace" => $trace, 
      "exceptions" => $exceptions, 
      'proxy_host' => $proxyHost, 
      "proxy_port" => $proxyPort, 
      "soap_version" => SOAP_1_2, 
      'stream_context' => stream_context_create(array('http' => array("header" => "request: GET"))) 
      )); 

без успеха. Кто-нибудь знает, как я могу заставить HTTP получить запрос при использовании SoapClient?

+0

Вы можете написать собственный класс, расширяющий SoapClient, и реализовать метод '__doRequest' для выполнения запроса с использованием' GET' –

ответ

0

Я провел некоторое исследование, и я обнаружил, что запрос GET был представлен в SOAP 1.2, но в целом SOAP не поддерживает запрос GET, в то время как REST делает это.

Я думаю, что в некоторых случаях возможно обходное решение. Это не простое решение, так как проблем не так много.

SOAP отправляет данные через POST. В запросе GET можно использовать только URL и обертывают любые параметры переменных, как

http://server.domain/path/file.php?var1=value1&var2=value2&etc=etc 

Таким образом, если SOAP принимают только GET, это странно, но если вы знаете, вы можете передать данные в переменной XML вы можете попытаться отправить его по адресу:

http://server.domain/path/file.php?xml=encoded_data 

Если это так (я не уверен), то вы можете использовать клиент SOAP, а затем сбросить запрос, как здесь: http://www.herongyang.com/ws/php_soap_2.html

echo("\nDumping request headers:\n" . $client->__getLastRequestHeaders()); 
echo("\nDumping request:\n" . $client->__getLastRequest()); 
echo("\nDumping response headers:\n" . $client->__getLastResponseHeaders()); 
echo("\nDumping response:\n" . $client->__getLastResponse()); 

в nd затем «закодировать» xml из $ client -> __ getLastRequest(), передать его URL-адресу и отправить его с помощью curl.

+0

У меня создается впечатление, что его по-прежнему отправляя XML как POST, по какой-то причине требуется, чтобы заголовок быть установленным как GET. К сожалению, единственный доступ к этому серверу осуществляется через интерфейс SOAP, поэтому я не могу быть уверен. Я успешно протестировал службу с помощью Wizdler (chrome plugin), установив тип запроса GET, однако я не уверен, как Wizdler отправляет XML-данные. – sharper

Смежные вопросы