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

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

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

WWW
« : 30-04-2010 06:40 » 

Задался задачкой: заменить на клиентах прямое обращение к БД на XML-RPC запросы на сервер. С XML пока более-менее понятно, а вот с http - еще нет.
Из того, что нашел в инете: народ использует Internet Transfer Control. Как я понял, он работает в асинхронном режиме, а мне нужен синхронный запрос. Посоветуете что-нибудь?
Записан

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

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

WWW
« Ответ #1 : 30-04-2010 07:01 » new

Уже нашел Улыбаюсь
Метод OpenURL.
http://www.devx.com/vb2themax/Tip/18441
Записан

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

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

WWW
« Ответ #2 : 30-04-2010 11:38 » 

В продолжение темы...

Начались трудности с кодировками. Использую MSXML2.XMLHTTP для выполнения POST-запросов на сервер. Ответ приходит в windows-1251, но при преобразовании в XML почему-то VB считает, что это latin1. В начале документа в объявлении XML есть кодировка:

Код:
"<?xml version="1.0" encoding="windows-1251"?>

В итоге, в поле получаю: "?inneeneay Oaaa?aoey"
А должно быть: "Российская Федерация"

Есть какие-нибудь идеи?
« Последнее редактирование: 30-04-2010 11:43 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

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

WWW
« Ответ #3 : 30-04-2010 12:53 » 

RXL, да utf8
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

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

WWW
« Ответ #4 : 30-04-2010 14:52 » 

Трабла оказалась на сервере: использую PHP и функции xmlrpc_*. Все не-ASCII символы они переводят в формат &#NNNN;, который по стандарту кодирует юникод и ничего более. Вероятно надо исходные данные перекодировать до возврата из метода.


Не помогает. Дурной xmlrpc в PHP. Кстати, как и ряд других нестабильных функций - совершенно не поддерживает ничего, кроме ASCII. Придется снова писать свою реализацию, как это было с JSON.
« Последнее редактирование: 30-04-2010 15:06 от RXL » Записан

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

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

« Ответ #5 : 30-04-2010 14:53 » 

Одного указания мало. Сам недавно наступил на эти грабли. Геренировал XSL-FO файл программно и в XmlWriter стояла дефолтная кодировка. Все исходники были на UTF-8, а немецкие умляуты не признавались в упор. Пока каждый участвующий файл не открыл в Блокноте и не сделал Save As, не увидел. Потом конечно допёр. Короче файл сам тоже должен быть сохранён в UTF-8.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
RXL
Технический
Администратор

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

WWW
« Ответ #6 : 30-04-2010 17:37 » 

Трабла исправляется так: результат, возвращаемый функцией xmlrpc_server_call_method, пропускаем через исправляющую самописную функцию.

Код:
<?php

function restore_after_xmlrpc($str)
{
    return 
preg_replace_callback(

        &
#39;/& #(\d+);/&#39;,  /* <-- пробел в шаблоне удалить! */
        
create_function(&#39;$m&#39;, &#39;
            
return str_replace(
                array(
"&""<"">""\""),
                array(
"&amp;""&lt;""&gt;""&quot;"),
                
pack("C"$m[1])
            );&
#39;
        
),
        
$str
    
);
}

?>


Функция универсальна — не чувствительна к кодировке текста: utf-8 или любая 8-битная.
« Последнее редактирование: 30-04-2010 18:51 от RXL » Записан

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

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

WWW
« Ответ #7 : 30-04-2010 17:54 » 

Для полноты картины и полезности материала добавлю VB-код для работы с HTTP.

Процедура посылки готового XML-RPC запроса:

Код:
Private Sub callXMLRPC(url as String, request As String, ByRef xml As MSXML2.DOMDocument)
    Dim http As New MSXML2.XMLHTTP

    Call http.Open("POST", url, False)
    Call http.send(request)

    If http.Status <> 200 Then
        Set http = Nothing
        Call Err.Raise(1, , "Ошибка запроса на сервер XML-RPC.")
    End If

    Set xml = http.responseXML
    Set http = Nothing
End Sub

Тестовый код, запрашивающий список в виде набора значений, где значение (n * 2) означает ключ, а (n * 2 + 1) - значение.

Код:
Private Sub loadSomeData(customerId as Long, ByRef items As Collection)
    Dim url as String
    Dim request As String
    Dim xml As MSXML2.DOMDocument
    Dim nodes As MSXML2.IXMLDOMNodeList

    On Error Resume Next

    url = "http://rpc-server/xml-rpc.php"

    request = "<?xml version=""1.0""?>" + _
        "<methodCall>" + _
            "<methodName>csr.client.getSomeData</methodName>" + _
            "<params>" + _
                "<param>" + _
                    "<value><i4>" + CStr(customerId) + "</i4></value>" + _
                "</param>" + _
            "</params>" + _
        "</methodCall>"

    Set items = new Collection

    Call callXMLRPC(request, xml)

    If Err > 0 Then
        Exit Sub
    End If

    Set nodes = xml.selectNodes("/methodResponse/params/param/value/array/data/value/string/text()")

    If nodes.length() > 0 Then
        Dim i As Long
        Dim key As String
        Dim value As String

        For i = 0 To nodes.length - 1 Step 2
            key = nodes(i).nodeValue
            value = nodes(i + 1).nodeValue
            Сall items.Add(value, key)
        Next
    End If
    
    Set nodes = Nothing
    Set xml = Nothing
End Sub

Вот такой XML ответ:

Код:
<?xml version="1.0" encoding="windows-1251"?>
<methodResponse>
<params>
 <param>
  <value>
   <array>
    <data>
     <value>
      <string>CUSTNR</string>
     </value>
     <value>
      <string>.......</string>
     </value>
     <value>
      <string>CONTRACTDATE</string>
     </value>
     <value>
      <string>......</string>
     </value>
     <value>
      <string>COUNTRY</string>
     </value>
     <value>
      <string>Российская Федерация</string>
     </value>
     <value>
      <string>FULLNAME</string>
     </value>
     <value>
      <string>Открытое акционерное общество &quot;.............&quot;</string>
     </value>
     <value>
      <string>MANDATE_FOR_AKT</string>
     </value>
     <value>
      <string/>
     </value>
    </data>
   </array>
  </value>
 </param>
</params>
</methodResponse>
« Последнее редактирование: 30-04-2010 18:52 от RXL » Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines