Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: VB6. Реализация XML-RPC клиента.  (Прочитано 10121 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« : 04-05-2010 19:49 » 

Не нашел в винде штатной возможности делать из VB6 запросы XML-RPC. В инете нашел только коммерческие реализации (может плохо искал или хорошо зарыто). В результате написал свою реализацию. Во многом она еще сырая, но потестить уже можно.

Мне потребовались ассоциативные массивы и на свет появились классы CAssocArray и CAssocItem. В отличии от элементов Collection, CAssocItem хранит свой ключ (копию) и он доступен (для всего, но писать в него не рекомендую).
Тот же CAssocItem использовал вместо Variant в рекурсивном разборе ответа в качестве параметра. Может можно было иначе, но синтаксис VB меня просто убивает и проще перейти совсем на объекты. чем мешать все в кучу.

Код для класса CBase64 целиком взят из инета в готовом виде. Работает на ура, но есть огромный минус: для хранения бинарных данных используется Byte(), что ограничивает объем до 32767 байт. По этой причине (и не только) реализовал тип <base64> только в декодере ответа, а в запросе код закомментировал (он не работает).

Код CInetTime также взят из инета, но подрихтован и дополнен. Он очень сырой.

Сам клиент помещен в класс CXMLRPCRequest.
Интерфейс:

Public Function doCall(url As String, method As String, ByRef params As Variant, ByRef result As Variant) As Boolean
Public Sub encodeRequest(ByVal method As String, ByRef request As Variant, ByRef xml As String)
Public Sub decodeResponse(ByRef xml As MSXML2.DOMDocument, ByRef argv As Variant, ByRef fault As Boolean)

Для выполнения запросов достаточно doCall.

Тест:

Код:
Private Sub Command1_Click()
    Dim rpc As New CXMLRPCRequest
    Dim fault As Boolean
    Dim params As New CAssocArray
    Dim result As Variant
   
    Call params.Add("CUSTNO", 1122345)
    Call params.Add("FULLNAME", "ЗАО ""Рога и Копыта""")
    Call params.Add("MTIME", Now)
    fault = rpc.doCall("http://server/services/test/xmlrpc.php", "test.client.echo", params, result)
End Sub

Файлы прилагаю. Прошу конструктивную критику и дополнения.

* CAssocArray.cls (1.67 Кб - загружено 929 раз.)
* CAssocItem.cls (0.87 Кб - загружено 904 раз.)
* CBase64.cls (1.28 Кб - загружено 927 раз.)
* CInetTime.cls (8.1 Кб - загружено 905 раз.)
* CXMLRPCRequest.cls (6.54 Кб - загружено 926 раз.)
* Form1.frm (1.1 Кб - загружено 925 раз.)
* Project1.vbp (0.88 Кб - загружено 943 раз.)
* Project1.vbw (0.21 Кб - загружено 921 раз.)
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 05-05-2010 06:10 » 

Тестирование на устойчивость парсера ответа к паразитным пробелам прошло успешно.

Вкупе с серверной частью список из 3193 структур (размер XML ответа - 876523 байт) был получен, пропарсен и занесен в Collection/CAssocArray примерно за две секунды.
« Последнее редактирование: 05-05-2010 06:56 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 05-05-2010 19:59 » 

Сделал под это дело SVN-репозиторий: http://svn.shelek.su/public/XML-RPC/VB6-client/trunk/
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 06-05-2010 18:44 » 

Сперва нашел, что если в IE настроен прокси, то MSXML2.XMLHTTP работает только через прокси и игнорирует дополнительные настройки, где указано не использовать прокси для локальных адресов.

Порылся по инету и нашел рекомендации использовать MSXML2.ServerXMLHTTP60.

Так, хорошо - работает без прокси (но можно его настроить разными путями). Замеряю объем прокачиваемых данных и фигею: 1.1 МБ. Ну, понятное дело - XMP-RPC дает жирный обвес (А представьте себе, какой обвес дал бы SOAP! Вспомнил недавний спор, где я ратовал за JSON.), увеличивающий объем данных в несколько раз (проверил - в 7..13 раз!). Наверно было бы логично использовать сжатие. Добавляю заголовок Accept-Encoding и получаю... нераспакованные данные. Еще немного фигею и начинаю рыться по инету. Нахожу, что компоненты MSXML2 не умеют работать со сжатием. Нашел единственный совет - использовать zlib.
Может кто знает более простое решение?
« Последнее редактирование: 06-05-2010 19:13 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines