Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.98/41: Рейтинг темы: голосов - 41, средняя оценка - 4.98
NaMoRZA
126 / 2 / 1
Регистрация: 24.07.2015
Сообщений: 17
1

Отправка и получение ответа XML

03.11.2015, 19:29. Просмотров 7440. Ответов 7

Здравствуйте.
Я в VBA не очень (учусь) и с такими задачами еще не сталкивался, - руководство поставило задачу сделать макрос проверки параметров сайта в Excel на основании API c сервиса recipdonor.com (пытаюсь сделать такой запрос: Проверка тИЦ).
3-й день уже гуглю и читаю форумы, вроде все более-менее понятно, но у меня никак не получается отправить запрос.. я уже молчу чтобы получить ответ..(( Подскажите пож-та, что я делаю не так.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub Zapros()
Set HTTP = CreateObject("MSXML2.XMLHTTP")
apiBase64 = "Basic MjQzM2EWRUIHERUIiueUIEiirfhpdowNjE2ZTIxMzg2Ong="   'ключ АПИ в Base64 - здесь тестовый
sURL1 = "http//recipdonor.com/api/session/new HTTP/1.1"
sql1 = "<InitSession><Parameters><TaskVariant>Cy</TaskVariant></Parameters><DomainNames><string>mozilla.com</string></DomainNames><Refresh>true</Refresh></InitSession>"
HTTP.Open "GET", sURL1, False
HTTP.SetRequestHeader "Host", "recipdonor.com:977"
HTTP.SetRequestHeader "Content-type", "text/xml; charset=utf-8"
HTTP.SetRequestHeader "Authorization", apiBase64
HTTP.SetRequestHeader "Content-Length", Len(sql1)
HTTP.send sql1
otvet = HTTP.responseText
[A1].Value = otvet
End Sub
На 6-й строке ругается Runtime Error -2147012890 (80072 ee6); Automation error.

Буду премного благодарен за помощь.
Спасибо.
0
Вложения
Тип файла: xls zapros.xls (22.5 Кб, 8 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2015, 19:29
Ответы с готовыми решениями:

Отправка и получение письма outlook
Как можно из vba access или из самого vba outlook автоматически нажимать кнопку отправить получить,...

Отправка запроса на сервер - получение ответа в xml и обработка
Всем добрый день. Искал по всем форумам и всем блогам, но нужного ответа не нашел и не добился...

Отправка запроса на сервер - получение ответа в xml и обработка
Пожалуйста помогите в решении проболемы. Извините если создаю дубль тем, ну очень нужно найти...

Отправка текста на сайт получение ответа
Можно ли сделать так: Чтобы потльзователь вводил текст,т е какую-нибудь строку,например...

Отправка POST запроса в ВК и получение ответа
Пытаюсь загрузить аватар в группу ВК. И при отправке post запроса с изображением, в ответ приходит...

7
NaMoRZA
126 / 2 / 1
Регистрация: 24.07.2015
Сообщений: 17
04.11.2015, 02:19  [ТС] 2
Уважаемые форумчане, положу еще здесь описание API:
Описание API - Проверка тИЦ, Я.Каталог
Проверка тИЦ, Я.Каталог и Зеркало
Для осуществления проверки тИЦ используются два API метода /session/new и /session/get.

В примере мы проверим на тИЦ сразу несколько сайтов mozilla.com, mozilla.ru, google.com, msdn.microsoft.com. Инициализация проверки осуществляется методом /session/new.

Создадим проверку послав в API запрос вида

PUT /api/session/new HTTP/1.1
Authorization: Basic RjkxNjhDNUUtQ0VCMi00ZmFhLUI2QkYtMzI5QkYzOUZBMUU0Ong=
Content-Type: text/xml; charset=utf-8
Host: recipdonor.com:977
Content-Length: 312

<InitSession>
<Parameters>
<TaskVariant>Cy</TaskVariant>
</Parameters>
<DomainNames>
<string>mozilla.com</string>
<string>mozilla.ru</string>
<string>google.com</string>
<string>msdn.microsoft.com</string>
</DomainNames>
<Refresh>true</Refresh>
</InitSession>

После выполнения запроса мы получим ответ,
XML
1
2
3
4
5
6
<ApiSessionItemSlimContract>
    <Id>f1218977-7a63-43eb-8e5c-a272ffb3886e</Id>
    <ExpireAt>2014-12-18T20:24:50.8100568+02:00</ExpireAt>
    <Progress>0</Progress>
    <SessionStatus>ToCheck</SessionStatus>
</ApiSessionItemSlimContract>
что говорит об успешном создании сессии проверки

Id - уникальный идентификатор сессии
ExpireAt - сессия будет уничтожена в указанное время
SessionStatus - Статус ToCheck говорит нам о том, что сессия поставлена на проверку

Системе на проверку параметра тИЦ может уйти некоторое время, ответ вы можете получить не сразу.

Для получения результатов проверки необходимо использовать метод /session/get

Формируем запрос

GET http://recipdonor.com:977/api/sessio...c-a272ffb3886e HTTP/1.1
Authorization: Basic RjkxNjhDNUUtQ0VCMi00ZmFhLUI2QkYtMzI5QkYzOUZBMUU0Ong=
Content-Type: text/xml; charset=utf-8
Host: recipdonor.com:977

Получаем ответ вида:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<ApiSessionItemContract>
    <Id>f1218977-7a63-43eb-8e5c-a272ffb3886e</Id>
    <ExpireAt>2014-12-18T20:24:52.9004605+02:00</ExpireAt>
    <Progress>100</Progress>
    <SessionStatus>Completed</SessionStatus>
    <Domains>
        <DomainData IsValid="true">
            <DomainName>mozilla.com</DomainName>
            <Values>
                <Data>
                    <Parameter>Cy</Parameter>
                    <Value xsi:type="CyApiData">
                        <Cy>12000</Cy>
                        <Yaca>0</Yaca>
                        <YaBarMirrow>0</YaBarMirrow>
                    </Value>
                </Data>
            </Values>
        </DomainData>
        <DomainData IsValid="true">
            <DomainName>mozilla.ru</DomainName>
            <Values>
                <Data>
                    <Parameter>Cy</Parameter>
                    <Value xsi:type="CyApiData">
                        <Cy>-666</Cy>
                        <Yaca>0</Yaca>
                        <YaBarMirrow>0</YaBarMirrow>
                    </Value>
                </Data>
            </Values>
        </DomainData>
        <DomainData IsValid="true">
            <DomainName>google.com</DomainName>
            <Values>
                <Data>
                    <Parameter>Cy</Parameter>
                    <Value xsi:type="CyApiData">
                        <Cy>190000</Cy>
                        <Yaca>Hi-Tech/Интернет/Поисковые системы</Yaca>
                        <YaBarMirrow>1</YaBarMirrow>
                    </Value>
                </Data>
            </Values>
        </DomainData>
        <DomainData IsValid="true">
            <DomainName>msdn.microsoft.com</DomainName>
            <Values>
                <Data>
                    <Parameter>Cy</Parameter>
                    <Value xsi:type="CyApiData">
                        <Cy>6400</Cy>
                        <Yaca>Hi-Tech/Программы/Операционные системы/Windows</Yaca>
                        <YaBarMirrow>0</YaBarMirrow>
                    </Value>
                </Data>
            </Values>
        </DomainData>
    </Domains>
</ApiSessionItemContract>
Продолжение здесь


Я в основном работаю с таблицами/листами/ячейками - думал, вродь, логически, ничего сложного - интернет есть - разберусь, а ничего не получается..(( то ли руки кривые, то ли - мозги не соображают..
0
Roman_rc
26 / 26 / 12
Регистрация: 04.02.2013
Сообщений: 250
05.11.2015, 08:25 3
http//recipdonor.com/api/session/new HTTP/1.1
Неправильная строка запроса! Где ":", как минимум вот так правильно http://recipdonor.com/api/session/new
Но и в этом случае ошибка т.е. запустим в браузере эту сроку и что получим? А получим 404, то есть нифига по этой строке нет.

Вот тебе рабочий код, исправляй только сроку запроса хедеры не обязательно устанавливать. Плюс пиши On Error Resume Next чтобы хотябы понимать что за ошибки выходят их описание.
указал рабочую сроку запроса vk на получение стран "http://api.vk.com/method/database.getCountries?v=5.5&need_all=1&count=1000" проверяй.


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Sub Zapros()
 
Dim xhr As New MSXML2.XMLHTTP60
Dim sURL1 As String
    'Set xhr = CreateObject("MSXML2.XMLHTTP")
    
    On Error Resume Next
 
    sURL1 = "http://api.vk.com/method/database.getCountries?v=5.5&need_all=1&count=1000"
    
    xhr.Open "GET", sURL1, False
    xhr.send sql1
    
    'Если readyState вернул 4 то все ок
    'Status - это результат ответа сервера типа если 404 то не найдено, а 200 всё отлично
    If (xhr.readyState = 4 And xhr.Status = 200) Then
        Debug.Print xhr.responseText
    End If
    
    'если произошла ошибка то обработаем её тут, прочитаем описание
    If (Err.Number <> 0) Then
        Debug.Print Err.Description
    End If
    
    
End Sub
2
NaMoRZA
126 / 2 / 1
Регистрация: 24.07.2015
Сообщений: 17
05.11.2015, 14:35  [ТС] 4
Здравствуйте, уважаемые форумчане!
Спасибо большое, Roman_rc за помощь!
На другом форуме некоторые вещи мне подсказали с некоторыми сам разобрался.. Одним словом основной вопрос решен:

Мои ошибки:
1. Забыл двоеточие в адресе поставить в sURL1 = "http://recipdonor.com/api/session/new HTTP/1.1"
2. в 6-й строке "HTTP.Open "GET", sURL1, False" надо было поставить True вместо False (т.е., True - создавать Асинхронное соединение).
3. В который раз прошелся по справке АПИ на сайте recipdonor.com и увидел ссылку на страницу тестирования запросов в АПИ - http://www.recipdonor.com/help/apitest, на которой видно, что в конце строки ссылки надо указывать "?format=xml", т.е., ссылка должна выглядеть так:
"http://recipdonor.com:977/api/session/new?format=xml"
в таком случае, сервер нормально принимает запрос и возвращает ответ в формате XML.
Если же в ссылке оставить в конце " HTTP/1.1", то запрос в формате XML отправляется нормально, но ответ приходит в формате JSON.
Одним словом, получается что некоторые части справки противоречат друг другу - наверно что-то менялось в API, но не везде в описании поправили.

Макросы, которые получились в конечном итоге:
1. Отправка запроса в формате XML:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub Zapros()
Set HTTP = CreateObject("MSXML2.XMLHTTP")
apiBase64 = "Basic RjkxNjhDNUUtQ0VCMi00ZmFhLUI2QkYtMzI5QkYzOUZBMUU0Ong="
sURL1 = "http://recipdonor.com:977/api/session/new?format=xml"
sql1 = "<InitSession><Parameters><TaskVariant>Cy</TaskVariant></Parameters><DomainNames><string>mozilla.com</string></DomainNames><Refresh>true</Refresh></InitSession>"
HTTP.Open "PUT", sURL1, True
HTTP.SetRequestHeader "Host", "recipdonor.com:977"
HTTP.SetRequestHeader "Content-type", "text/xml; charset=utf-8"
HTTP.SetRequestHeader "Authorization", apiBase64
HTTP.SetRequestHeader "Content-Length", Len(sql1)
HTTP.send sql1
Do While HTTP.readyState <> 4
    DoEvents
Loop
[A1].Value = HTTP.responseText
End Sub
Получаем ответ в формате XML:
XML
1
2
3
4
5
6
7
8
<ApiSessionItemSlimContract 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Id>38fa4bcd-ee36-4cb5-992b-96068a87f4d6</Id>
<ExpireAt>2015-11-04T21:23:22.3829571+02:00</ExpireAt>
<Progress>0</Progress>
<SessionStatus>AtChecking</SessionStatus>
</ApiSessionItemSlimContract>
С ответа берем Id сессии (38fa4bcd-ee36-4cb5-992b-96068a87f4d6) и используем его в следующем запросе на получение данных:
2. Запрос на получение данных в формате XML:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub ZaprosEnd()
Set HTTP = CreateObject("MSXML2.XMLHTTP")
apiBase64 = "Basic RjkxNjhDNUUtQ0VCMi00ZmFhLUI2QkYtMzI5QkYzOUZBMUU0Ong="
sURL1 = "http://recipdonor.com:977/api/session/get?id=38fa4bcd-ee36-4cb5-992b-96068a87f4d6&format=xml"
sql1 = "<InitSession><Parameters><TaskVariant>Cy</TaskVariant></Parameters><DomainNames><string>mozilla.com</string></DomainNames><Refresh>true</Refresh></InitSession>"
HTTP.Open "GET", sURL1, True
HTTP.SetRequestHeader "Host", "recipdonor.com:977"
HTTP.SetRequestHeader "Content-type", "text/xml; charset=utf-8"
HTTP.SetRequestHeader "Authorization", apiBase64
HTTP.send
Do While HTTP.readyState <> 4
    DoEvents
Loop
[A2].Value = HTTP.responseText
End Sub
И получаем ответ в формате XML :
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<ApiSessionItemContract 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <Id>38fa4bcd-ee36-4cb5-992b-96068a87f4d6</Id>
   <ExpireAt>2015-11-04T21:23:22.3829571+02:00</ExpireAt>
   <Progress>100</Progress>
   <SessionStatus>Completed</SessionStatus>
   <Domains>
      <DomainData IsValid="true">
         <DomainName>mozilla.com</DomainName>
         <Values>
            <Data>
               <Parameter>Cy</Parameter>
               <Value xsi:type="CyApiData">
                  <Cy>13000</Cy>
                  <Yaca>0</Yaca>
                  <YaBarMirrow>0</YaBarMirrow>
               </Value>
            </Data>
         </Values>
      </DomainData>
   </Domains>
</ApiSessionItemContract>
А тем, кто хочет получать данные в формате JSON надо совсем чуть-чуть поменять в запросах:
в обоих запросах в конец ссылки добавить " HTTP/1.1", например, в первом запросе строка со ссылкой должна быть такой:
sURL1 = "http://recipdonor.com:977/api/session/new?format=xml HTTP/1.1"

Вроде бы все расписал - вдруг кому пригодится.
Остался один вопрос - может подскажете готовое решение или ткнете носом куда-то:
Как быстро разбирать эти полученные ответы в формате XML?
Заранее, спасибо.
Пример XML прикладываю.
1
Вложения
Тип файла: zip Zapros_XML.zip (509 байт, 23 просмотров)
Roman_rc
26 / 26 / 12
Регистрация: 04.02.2013
Сообщений: 250
05.11.2015, 14:54 5
Visual Basic
1
2
3
Do While HTTP.readyState <> 4
    DoEvents
Loop
К сожалению в VBA нет возможности присвоить обработку к событию onreadystatechange.
У тебя очень интересное решение обработки асинхронного запроса)).
0
NaMoRZA
126 / 2 / 1
Регистрация: 24.07.2015
Сообщений: 17
06.11.2015, 00:32  [ТС] 6
Цитата Сообщение от Roman_rc Посмотреть сообщение
У тебя очень интересное решение обработки асинхронного запроса)).
А у Вас есть другое какое-то? поделитесь - будет интересно!
Я только учусь - в воскресенье только узнал что такое "асинхронный запрос"..)) да и вообще впервые столкнулся с запросами (не считая элементов Oracle SQL) и XML..)) хотя макросы пишу уже пару лет, - просто задачи все больше стояли локальные - отчеты в Excel, небольшие запросы из Excel в Oracle, обработка введенных пользователями данных, работа с файлами и т.п.
Пришло новое начальство - "по новому метет" - свои мульки и тараканы..
А мне и хорошо - есть сложные и неизведанные задания - мозг начинает работать, не скучно))

Кстати, еще раз, спасибо за помощь! А особенно за комментарии к коду и объяснения!
Да, за обработку ошибок я забыл - обязательно себе напишу.
И за "'Status - это результат ответа сервера типа если 404 то не найдено, а 200 всё отлично" - тоже спаисбо! - я наверно о нем уже полусонный какой-то ночью читал - что-то вообще пропустил его как несущественный - а мог бы сэкономить время на тестировании если б обрабатывал ошибку 404.. )) ну да, ладно..
0
Roman_rc
26 / 26 / 12
Регистрация: 04.02.2013
Сообщений: 250
06.11.2015, 06:29 7
А у Вас есть другое какое-то? поделитесь
нет, у Вас действительно хорошее решение!

Обычно ставят false, чтобы дождаться ответа от сервера но это стандартно и неинтересно)
0
Ranzou_n70
0 / 0 / 0
Регистрация: 04.02.2016
Сообщений: 1
04.02.2016, 00:46 8
Наконец-то! Пожалуй единственный топик, где рассматривается отправка и получение запроса на VBA без использования прочих костылей.
У меня работа с VK.API (темы поднимались, но нет ответов):
Есть столбец id, по каждому отправить запрос и записать полученные данные.
(цикл)
Чтение ID из ячейки А%, отправка запроса https://api.vk.com/method/users.get.xml?user_id=A%&fields=online,last_seen&v=5.44
Получение ответа (для ID 1, например)
XML
1
2
3
4
5
6
7
8
9
10
11
12
<response list="true">
<user>
<id>1</id>
<first_name>Павел</first_name>
<last_name>Дуров</last_name>
<online>0</online>
<last_seen>
<time>1398447188</time>
<platform>7</platform>
</last_seen>
</user>
</response>
Записать значения online в B% и last_seen в C%
%+1
(/цикл)
Пока буду сам медленно, но верное разбираться.
0
04.02.2016, 00:46
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2016, 00:46

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Отправка http запроса и получение ответа
я понимаю что есть дофига тем про это, я честно гуглила и искала, но находила в основном код без...

Отправка POST запроса и получение ответа
Есть проблема. Нужно отправить на сайт POST запрос и в зависимости от этого запроса сайт выдает...

Отправка запроса на сервер, и получение ответа
Нужно сделать запрос на сайт, &quot;http://....... .php и что бы он в ответ выдал Фамилию и пароль....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.