Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 593 сообщений
Cообщения с меткой

soap - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

[Из песочницы] Получение текста запросов из SoapHttpClientProtocol

Понедельник, 11 Сентября 2017 г. 15:50 (ссылка)






XelMed


сегодня в 15:50

Разработка





Получение текста запросов из SoapHttpClientProtocol










У .NET есть несколько вариантов создания SOAP клиента, одним из них является его генерация с помощью wsdl.exe. На выходе получаем файл (поскольку пишу я на C#, то генерировал cs, соответственно), основой которого является класс, унаследованный от SoapHttpClientProtocol. Подробнее тут.



С моей точки зрения, это достаточно удобный способ, к тому же сам клиент можно подразогнать с помощью sgen.exe (очень хороший пример). Тем не менее есть у него один очень серьезный недостаток — это отсутствие штатной возможности получения текста запроса/ответа. А это было бы крайне удобно при первичной отладке сервисов, разборе ошибок и, самое главное, при возможных разбирательствах со стороны, эти самые сервисы предоставляющей.



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



Основная идея



Вполне хорошим выходом будет каким-либо образом переопределить SoapHttpClientProtocol и добавить эту самую возможность логирования. Вариант для получения запросов клиента, представленный тут, был взят за основу, после чего к нему была «прикручена» возможность логирования и ответов сервера.



Переопределям SoapHttpClientProtocol



Релизуем свой класс, пусть будет SoapHttpClientProtocolSpy, унаследованный от SoapHttpClientProtocol соответственно. Для перехвата запросов клиента переопределяем метод GetWriterForMessage, а для перехвата ответов сервера — GetReaderForMessage. Первый возвращает XmlWriter, второй — XmlReader; вместо них и вернем собственные реализации, которые будут позволять получить XMl, через них проходящий.



Получаем следующий класс:



SoapHttpClientProtocolSpy
   public class SoapHttpClientProtocolSpy: SoapHttpClientProtocol
{
private XmlWriterSpy writer;
private XmlReaderSpy reader;
public SoapHttpClientProtocolSpy() : base(){}

protected override XmlWriter GetWriterForMessage(SoapClientMessage message, int bufferSize)
{
writer = new XmlWriterSpy(base.GetWriterForMessage(message, bufferSize));
return writer;
}

protected override XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize)
{
reader = new XmlReaderSpy(base.GetReaderForMessage(message, bufferSize));
return reader;
}

public string XmlRequest => reader?.Xml;
public string XmlResponce => writer?.Xml;
}




XmlWriterSpy и XmlReaderSpy — это декораторы для XmlWriter и XmlReader.



XmlWriterSpy



В сущности, сама реализация заключается в добавлении StringWriter, в который и будем складировать текст запроса по ходу обработки. То есть необходимо переопределить все методы записи так, чтобы они вызывали штатный обработчик и передавали результат в StringWriter.



Реализация
    public class XmlWriterSpy : XmlWriter
{
//это же декоратор, поэтому просто пользуемся той реализацией, которая придет
private XmlWriter _me;
private XmlTextWriter _bu;
private StringWriter _sw;

public XmlWriterSpy(XmlWriter implementation)
{
_me = implementation;
_sw = new StringWriter();
_bu = new XmlTextWriter(_sw);
_bu.Formatting = Formatting.Indented;
}

public override void Flush()
{
_me.Flush();
_bu.Flush();
_sw.Flush();
}
public string Xml => _sw?.ToString();

public override void Close() { _me.Close(); _bu.Close(); }
public override string LookupPrefix(string ns) { return _me.LookupPrefix(ns); }
public override void WriteBase64(byte[] buffer, int index, int count) { _me.WriteBase64(buffer, index, count); _bu.WriteBase64(buffer, index, count); }
public override void WriteCData(string text) { _me.WriteCData(text); _bu.WriteCData(text); }
//И так далее, в том же духе

}




Еще раз спасибо данной статье за это.



XmlWriterSpy



Здесь идея абсолютно та же. Но только с реализацией придется немного повозиться. С одной стороны, достаточно влезть только в 1 метод(Read), с другой стороны, там чтение из потока, и не так просто его не сломать. Идею взял отсюда.



Реализация
    public class XmlReaderSpy : XmlReader
{
//это же декоратор, поэтому просто пользуемся той реализацией, которая придет
private XmlReader _baseXmlReader;
StringWriter _sw;
public string Xml => _sw?.ToString();
public XmlReaderSpy(XmlReader xmlReader)
{
_sw = new StringWriter();
_baseXmlReader = xmlReader;
}


public override bool Read()
{
//получаем прочитанную ноду
var res = _baseXmlReader.Read();
//каждый тип ноды придется обрабатывать немного по-разному
switch (_baseXmlReader.NodeType)
{
case XmlNodeType.Element:
_sw.Write("<" + _baseXmlReader.Name);
while (_baseXmlReader.MoveToNextAttribute())
_sw.Write(" " + _baseXmlReader.Name + "='" + _baseXmlReader.Value + "'");
_sw.Write(_baseXmlReader.HasValue || _baseXmlReader.IsEmptyElement ? "/>" : ">");
//поскольку мы перемещались по элементу, надо вернуться на исходную
_baseXmlReader.MoveToElement();
break;

case XmlNodeType.Text:
_sw.Write(_baseXmlReader.Value);
break;
case XmlNodeType.CDATA:
_sw.Write(_baseXmlReader.Value);
break;
case XmlNodeType.ProcessingInstruction:
_sw.Write("");
break;
case XmlNodeType.Comment:
_sw.Write("");
break;
case XmlNodeType.Document:
_sw.Write("");
break;
case XmlNodeType.Whitespace:
_sw.Write(_baseXmlReader.Value);
break;
case XmlNodeType.SignificantWhitespace:
_sw.Write(_baseXmlReader.Value);
break;
case XmlNodeType.EndElement:
_sw.Write("");
break;
}
return res;
}
}




Все остальные методы переопределяем на простой вызов того же метода у _baseXmlReader.



Использование



Вспомним о сгенерированном классе, теперь нужно всего лишь унаследовать его от SoapHttpClientProtocolSpy. Стоит сказать, что такая реализация работает, даже если сервер вернет ошибку (то есть она будет тоже залогирована). Ну а далее вызов метода выглядит примерно так:




using (var worker = new Service())
{
try
{
res = worker.Metod(....);
Log.Info((worker?.XmlRequest ?? "")+(worker?.XmlResponce ?? ""));
}
catch (System.Exception ex)
{
Log.Error((worker?.XmlRequest ?? "")+(worker?.XmlResponce ?? ""));
throw ex;
}
}


PS. С моей точки зрения, достаточно удобным будет вынести это все в отдельную либу. Единственное, что будет постоянно напрягать, так это необходимость после обновления клиента лезть в файл и заменять там SoapHttpClientProtocol, но это мелочи.


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/337672/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
NONNA_SMETANINA

Натуральное мыло "Апельсин и шоколад"

Пятница, 01 Сентября 2017 г. 14:13 (ссылка)


Мыло с легким, ненавязчивым ароматом апельсина и шоколада. Сварено на гидролате апельсина, с добавлением тертых какао-бобов. И совершенно невозможно удержаться от украшения мыла сушеными дольками апельсина.



Состав натурального мыла - масла оливы ev, кокоса, клещевины, пальмоядровое, зародышей пшеницы, пальмы, лимонная кислота, тертые какао-бобы, гидролат апельсина, масло облепихи.



Вес - 100-105 гр



Цена 320 руб



Подробнее об этом мыле можно прочесть в моем магазине на Ярмарке Мастеров, а можно и купить -  https://www.livemaster.ru/item/22175235



Натуральное мыло "Апельсин и шоколад"/4487210_ (700x700, 288Kb)



Натуральное шоколадное мыло "Апельсин и шоколад"/4487210_Shokolad_i_apelsin6 (700x700, 308Kb)



Органическое мыло "Апельсин и шоколад"/4487210_Shokolad_i_apelsin7 (700x700, 314Kb)



Натуральное мыло с нуля "Апельсин и шоколад"/4487210_Shokolad_i_apelsin5 (700x700, 347Kb)



Ароматное натуральное мыло с апельсином и шоколадом/4487210_Shokolad_i_apelsin3 (700x700, 339Kb)

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
NONNA_SMETANINA

Мыло натуральное "Белый шоколад"

Четверг, 31 Августа 2017 г. 13:26 (ссылка)


Неожиданно сварилась целая серия шоколадных мыл с различными добавками. А одно из них - белое, с большим количеством масла какао. Да и весь состав впечатляет - масла какао, кокоса, оливы, клещевины, пальмовое, пальмоядровое, ши, зародышей пшеницы, сладкого миндаля.



Это мыло идеально подойдет для сухой и нормальной кожи.



Не содержит искусственных отдушек, красителей, ароматизаторов, продуктов животного происхождения. Подходит веганам. Подходит детям.



Вес одного кусочка - 110-115 гр



Цена - 320 руб



Купить можно, написав сообщение здесь, на ЛиРу, или перейдя в мой магазин на Ярмарке Мастеров - https://www.livemaster.ru/item/22174951



Натуральное мыло ручной работы "Белый шоколад"/4487210_ (700x700, 282Kb)



Натуральное мыло с нуля "Белый шоколад"/4487210_Belii_shokolad4 (700x700, 285Kb)



Натуральное органическое мыло "Белый шоколад"/4487210_Belii_shokolad7 (700x700, 248Kb)



Натуральное эко мыло "Белый шоколад"/4487210_Belii_shokolad10 (700x700, 324Kb)

Метки:   Комментарии (2)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Перестаньте терять деньги в Adwords при форс-мажорах с сайтом

Среда, 23 Августа 2017 г. 11:30 (ссылка)

При текущих ценах на рекламу хочется быть уверенным в эффективности, не правда ли? Запуская кампанию, предполагается, что ни зной, ни холод не станет на ее пути. Но даже надежные сайты иногда сбоят. Как сделать так, чтобы деньги в это время не улетели в трубу? Рассмотрим нюансы и решение от сервиса мониторинга доступности сайтов ХостТрекер.




Читать дальше ->

https://habrahabr.ru/post/336220/

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Как автоматически остановить Google Adwords кампанию при сбоях с сайтом

Среда, 23 Августа 2017 г. 07:39 (ссылка)

При текущих ценах на рекламу хочется быть уверенным в эффективности, не правда ли? Запуская кампанию, предполагается, что ни зной, ни холод не станет на ее пути. Но даже надежные сайты иногда сбоят. Как сделать так, чтобы деньги в это время не улетели в трубу? Рассмотрим нюансы и решение от сервиса мониторинга доступности сайтов ХостТрекер.




Читать дальше ->

https://habrahabr.ru/post/336178/

Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] SOAP и REST сервисы с помощью Python-библиотеки Spyne

Четверг, 27 Июля 2017 г. 18:13 (ссылка)

Знакомство с библиотекой Spyne



В данной статье я хочу рассказать о замечательной Python-библиотеке Spyne.

Мое знакомство с Spyne началось в тот момент, когда передо мной поставили задачу написать Веб-сервис, который будет принимать и отдавать запросы через SOAP-протокол. Немного погуглив я наткнулся на Spyne, которая является форком библиотеки soaplib. А еще я был удивлен, насколько мало русскоязычной информации встречается о данной библиотеке.



С помощью Spyne можно писать веб-сервисы, которые умеют работать с SOAP, JSON, YAML, а написанный скрипт можно запустить через mod_wsgi Apache. Итак, давайте рассмотрим несколько примеров, напишем работающие скрипты и настроим так, чтобы скрипты работали через apache.



1. SOAP-сервис



Давайте напишем веб-сервис, который будет служить нам переводчиком на английский язык. Наш веб-сервис будет получать запросы, обращаться в Yandex-translator, получать перевод и данный перевод отдавать клиенту. Принимаются входящие запросы в XML-формате. Ответ также будет уходить в XML-формате.



Первым делом необходимо получить API-ключ, чтобы сказать Яндексу, что мы свои. Как можно это сделать, смотрим тут.



Теперь переходим непосредственно к разработке.



Устанавливаем необходимые библиотеки: «pytz», «spyne», а также «yandex_translate». Библиотеки ставятся очень легко через pip.



Код приложения выглядит следующим образом:



from spyne import Application, rpc, ServiceBase, Unicode
from lxml import etree
from spyne.protocol.soap import Soap11
from spyne.protocol.json import JsonDocument
from spyne.server.wsgi import WsgiApplication
from yandex_translate import YandexTranslate

class Soap(ServiceBase):
@rpc(Unicode, _returns=Unicode)
def Insoap(ctx, words):
print(etree.tostring(ctx.in_document))
translate = YandexTranslate('trnsl.1.1.201somesymbols')
tr = translate.translate(words, 'en')
tr_answer = tr['text'][0]
return tr_answer
app = Application([Soap], tns='Translator',
in_protocol=Soap11(validator='lxml'),
out_protocol=Soap11()
application = WsgiApplication(app)
if __name__ == '__main__':
from wsgiref.simple_server import make_server
server = make_server('0.0.0.0', 8000, application)
server.serve_forever()


Разберем код:



После импортирования необходимых библиотек, мы создали класс «Soap» с аргументом «ServiceBase». Декоратор "@rpc(Unicode, _returns=Unicode)" определяет тип входящих аргументов («Unicode») и исходящих ответов ("_returns=Unicode"). Список доступных типов аргументов можно посмотреть в официальной документации.. Далее создается метод «Insoap» с аргументами «ctx» и «words». Аргумент «ctx» очень важен, так как в нем содержится много информации о входящих запросах. Строка «print(etree.tostring(ctx.in_document))» выводит на экран входящий xml-запрос, в таком виде, в каком нам его отправил пользователь. В некоторых моментах это может быть важно. Например, мне в ходе написания веб-сервиса нужно было вытащить входящий xml-запрос и записать в базу данных. Но как вытащить этот xml-запрос не упомянуто в официальной документации Spyne. Burak Arslan (автор Spyne) порекомендовал смотреть в сторону библиотеки lxml. Только после этого я нашел ответ и результат видите в данноме скрипте. Далее наш метод обращается в Яндекс-переводчик и возвращает клиенту полученный от Яндекс-переводчика результат.



Переменная «app» определяет настройки нашего веб-сервиса: «Application([Soap]» — указывается, какой класс инициализируется (их может быть несколько), параметры «in_protocol» и «out_protocol» определяет тип входящих и исходящих запросов, в нашем случае это SOAP v1.1.



Строкой «application = WsgiApplication(app)» определяется, чтобы наш скрипт мог работать через wsgi.



Важно! имя переменного обязательно должен быть «application», чтобы наше приложение мог работать через apache с помощью mod_wsgi.

Последующие строки кода инициализирует и запускает Веб-сервер по порту 8000.



Запускаем скрипт и можно приступать к тестированию. Для этих целей я использую SoapUI. Удобство состоит в том, что после запуска и настройки для работы с SOAP сервером, SoapUI автоматически формирует xml-запрос. Наш xml-запрос выглядит следующим образом:



Тело xml-запроса
schemas.xmlsoap.org/soap/envelope» xmlns:tran=«Translator»>







Тестируем наше приложение







Наш веб-сервис дал следующий ответ:



Ответ от сервера
schemas.xmlsoap.org/soap/envelope» xmlns:tns=«Translator»>





Test our app







Все просто, не правда ли?



2. REST-сервис



Предположим, что теперь у нас поменялось тех. задание, и нужно сделать веб-сервис, который работает через JSON. Что делать? Переписывать наш сервис на другом фреймворке, например Django Rest Framework или Flask? или можно обойтись меньшими усилиями? Да, можно! И нужно!



Библиотека Spyne нам в помошь.



Все что потребуется поменять в нашем приложении, это переменную «app» привести к следующему виду:



app = Application([Soap], tns='Translator',
in_protocol=JsonDocument(validator='soft'),
out_protocol=JsonDocument())


Запускаем наш веб-сервис и тестируемся.



Наш JSON-запрос выглядит так:



Тело JSON-запроса
{«Insoap»: {«words»:«тестируем наш веб-сервис. Используем JSON»}}



Веб сервер вернул следующий ответ:



Ответ веб-сервера
«test our web service. Use JSON»



3. Вывод в продакшн



Для запуска нашего веб-сервиса через apache, необходимо на сервер установить и настроить веб-сервер apache и mod_wsgi. Данные работы несложно выполнить, опираясь на документацию. Кроме этого, в нашем скрипте мы должны удалить следующие строки:



Строки для удаления
if __name__ == '__main__':

from wsgiref.simple_server import make_server

server = make_server('0.0.0.0', 8000, application)

server.serve_forever()



Ура! Наш веб-сервис готов к использованию в эксплуатации.



P.S. о дополнительных возможностях Spyne (а их немало) всегда можно ознакомиться на официальном сайте, чего я вам очень рекомендую.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/334290/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Made4Home

Мыло с дегтем и маслом ним

Среда, 05 Июля 2017 г. 22:51 (ссылка)


6008819_Degot_Nim (600x400, 56Kb)



Мыло с дегтем и маслом ним (маргозы) изготовлено горячим способом.



Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Made4Home

Мыло с древесным углем на отваре зеленого чая

Среда, 05 Июля 2017 г. 21:07 (ссылка)


6008819_Ugolnoe_zeleniy_chay_1_ (600x403, 85Kb)



Мыло с легким ароматом масла какао изготовлено горячим способом на крепком отваре зеленого чая с добавлением пудры березового угля.



Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Made4Home

Шоколадное

Суббота, 13 Мая 2017 г. 14:54 (ссылка)




6008819_shokolad1 (600x411, 60Kb)Мыло с ароматом горячего шоколада сварено на оливковом, кокосовом, пальмовом, касторовом и подсолнечном маслах.  





Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Made4Home

Упаковка мыла ручной работы

Суббота, 13 Мая 2017 г. 14:17 (ссылка)


6008819_Nabor (600x393, 74Kb)Вариант упаковки наборчика. Возможны и иные формы:)



Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Made4Home

Мыло с глинами и углем

Суббота, 13 Мая 2017 г. 13:47 (ссылка)


6008819_glina_all (600x416, 57Kb)



Предлагаются несколько вариантов мыла с глинами. Сварены они на оливковом, кокосовом, пальмовом, касторовом и подсолнечном маслах.  



Читать далее...
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<soap - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda