Я использую ruby для отправки SOAP-запроса на очень бизнес-бла-бла-сервис, поэтому, к сожалению, я не могу прикрепить какие-либо образцы, отправлять любые серверные журналы, никто не знает, что не так на стороне поставщика или как должны выглядеть фактические HTTP-запросы (за исключением одного XML-примера, который я получил, но нет заголовков HTTP), документы очень ориентированы на Microsoft с примерами C# и whatnot («экземпляр AbstractFactoryFactory ...» и еще что), долгое программное обеспечение для предприятий.Отправка XML SOAP вручную и получение кода ошибки HTTP 500 и двоичных данных в ответе
Но в итоге я взял один из своих XML-файлов из своих журналов и отправил их через HTTP в конечную точку из WSDL и отправил их на свой хост с помощью Savon gem raw XML option и получил сообщение об ошибке HTTP 500 со своего хоста и кучу двоичных данных не-ascii внутри - буквально, никакие символы ASCII не находятся в теле.
Я предположил, что, возможно, Савон делает плохие магии или что вариант XML не работает, как ожидалось, и я пытался посылать тот же запрос через Фарадей, но получил то же самое,
заголовков ответа HTTP говорит, что это ответ HTTP, XML кодированию, из хоста ASP.NET:
"content-type"=>"text/xml; charset=utf-8",
"server"=>"Microsoft-IIS/7.5",
"x-aspnet-version"=>"2.0.50727",
"x-powered-by"=>"ASP.NET",
, но опять же, 440 байт на сумму двоичных файлов в ответ:
method=:post,
body=
"\x1F\x8B\b\x00\x00...
и т.д.
Я пропустил какой-то странный аспект спецификации SOAP, и мне нужно что-то сделать для того, чтобы декодировать эти данные, или их сервер ушел от моих XML-заголовков или HTTP-заголовков или что-то еще, и мне нужно выполнить ping-провайдер?
Update 1
я заметил, что их оригинальный XML был UTF-16 набора кодирования, поэтому я попытался кодирующей сырец строки в UTF-16, а затем был Савон изрыгать ошибки у меня о плохих данных, то я обновил кодирование в конфиге клиента Savon. Но я все еще получаю HTTP 500 ошибок и двоичные файлы в качестве ответа, и если я пытаюсь что-нибудь войти Савон сообщает об ошибке:
Encoding::CompatibilityError: incompatible encoding regexp match (US-ASCII regexp with UTF-16 string)
from /home/bbozo/.rvm/gems/ruby-2.2.4/gems/savon-2.11.1/lib/savon/log_message.rb:13:in `to_s'
Фарадея в основном сообщили такое же поведение, в блоб.
Update 2
Я попытался обжигающе кодировку каждого известного кодирования, и ничего не получил, несмотря на то, что заголовки HTTP подразумевает кодирование UTF-8, это, очевидно, не
Encoding.name_list.map{ |e_in| [ e_in, (response.body.dup.force_encoding(e_in).encode('utf-8') rescue 'incompatible') ] }
Там ничто не указывает на кодировку в файлах WSDL, спецификация API даже не упоминает кодировку, за исключением того, что XML-запросы запроса должны быть кодировкой UTF-8, я пытался кодировать тело, изменяя определение кодировки XML, заголовки HTTP, но все же я получаю один и тот же двоичный blob, с тем же заголовком (\x1F\x8B\b\x00\x00
) - так что это не какое-то странное шифрование.
Возможно сжатие?
Я пробовал с https для хорошей меры и ничего.
Вопрос
мне не хватает какой-то странный аспект спецификации SOAP, и мне нужно сделать что-то, чтобы расшифровать эти данные или имеет их сервер пошли помешанные из моего XML, HTTP заголовки или что-то другое, и мне нужно пинговать провайдер?
Вы пробовали потреблять ответ XML с Nokogiri? Я успешно работал с DOTNET, реализованным SOAP/WS *. –
Спасибо @SteffenRoller, я просто попытался разобрать запрос с помощью 'Hash.from_xml', и он отлично работал, поэтому формат XML должен быть в порядке – bbozo