|
Помогите разобраться с WS-ссылками | ☑ | ||
---|---|---|---|---|
0
kan81
29.08.14
✎
11:35
|
Доброго времени суток.
Заранее прошу не ругать, если что-то спрошу "глупое" или очевидное, в первый раз сталкиваюсь с ws-ссылками. Есть некий сервис с API, данные с которого надо получать через SOAP. Есть рабочий код на php, нужен аналог для 1С. Есть описание: Метод "getTicketsByDate" Входные параметры: На вход метод принимает объект класса stdClass со следующими свойствами: $object->login – Ваш логин в системе. $object->password – Ваш пароль в системе. $object->from – Начало периода в формате timestamp, по умолчанию с самого начала UNIX-time. $object->to – Конец периода в формате timestamp, по умолчанию текущая дата. Есть пример кода на php, который работает как надо: <?php $client = new Soapclient('89.20.149.116/pcsupport/tm/soap?wsdl'); $data = new stdClass(); $data->login = "login"; $data->password = "password"; $data->from = "1370894743"; $data->to = "1371729943"; $result = $client->getTicketsByDate($data); ?> В 1С такой код (может и корявый, но пока какой есть): URL = "http://89.20.149.116/pcsupport/tm/soap"; Login = "......"; Password = "......"; Определения = Новый WSОпределения(Строка(URL) + "?wsdl", Login, Password); СервисWS = Новый WSПрокси(Определения , URL , "getTicketsByDatewsdl" , "getTicketsByDatewsdlPort"); Пакет = Определения.ФабрикаXDTO.Пакеты.Получить(URL); ТипОбъекта = Неопределено; Для i = 0 По Пакет.Количество() - 1 Цикл Если СокрЛП(Пакет.Получить(i).Имя) = "get_tickets_by_date_data" Тогда ТипОбъекта = Пакет.Получить(i); КонецЕсли; КонецЦикла; Если ТипОбъекта <> Неопределено Тогда НовыйОбъектXDTO = СервисWS.ФабрикаXDTO.Создать(ТипОбъекта,); НовыйОбъектXDTO.login = Login; НовыйОбъектXDTO.password = Password; НовыйОбъектXDTO.from = "1388520000"; НовыйОбъектXDTO.to = "1409227799"; Ответ = СервисWS.getNewTickets(НовыйОбъектXDTO); КонецЕсли; После выполнения получаю ошибку: Ошибка проверки данных XDTO:Значение: '1388520000' не соответствует простому типу: { http://www.w3.org/2001/XMLSchema}dateTime Изменяю код на следующий: URL = "http://89.20.149.116/pcsupport/tm/soap"; Login = "......"; Password = "......"; Определения = Новый WSОпределения(Строка(URL) + "?wsdl", Login, Password); СервисWS = Новый WSПрокси(Определения , URL , "getTicketsByDatewsdl" , "getTicketsByDatewsdlPort"); Пакет = Определения.ФабрикаXDTO.Пакеты.Получить(URL); ТипОбъекта = Неопределено; Для i = 0 По Пакет.Количество() - 1 Цикл Если СокрЛП(Пакет.Получить(i).Имя) = "get_tickets_by_date_data" Тогда ТипОбъекта = Пакет.Получить(i); КонецЕсли; КонецЦикла; Если ТипОбъекта <> Неопределено Тогда XDTO_ТипДата = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime"); НовыйОбъектXDTO = СервисWS.ФабрикаXDTO.Создать(ТипОбъекта,); НовыйОбъектXDTO.login = Login; НовыйОбъектXDTO.password = Password; НовыйОбъектXDTO.from = ФабрикаXDTO.Создать(XDTO_ТипДата, НачалоГода(ТекущаяДата())); НовыйОбъектXDTO.to = ФабрикаXDTO.Создать(XDTO_ТипДата, ТекущаяДата()); Ответ = СервисWS.getNewTickets(НовыйОбъектXDTO); КонецЕсли; После выполнения получаю такую ошибку: Метод объекта не обнаружен (getNewTickets) Ответ = СервисWS.getNewTickets(НовыйОбъектXDTO); Подскажите где и что делаю не так, или совсем иду не в том направлении Заранее благодарен за ответ. |
|||
1
kan81
29.08.14
✎
12:01
|
В конфигурацию добавил новую WS-ссылку - SOAP.
Переписал код: WSОпределения = WSСсылки.SOAP.ПолучитьWSОпределения(); Пакеты = WSОпределения.ФабрикаXDTO.Пакеты.Получить("http://89.20.149.116/pcsupport/tm/soap"); ТипОбъекта = Неопределено; Для i = 0 По Пакеты.Количество() - 1 Цикл Если СокрЛП(Пакеты.Получить(i).Имя) = "get_tickets_by_date_data" Тогда ТипОбъекта = Пакеты.Получить(i); КонецЕсли; КонецЦикла; Если ТипОбъекта <> Неопределено Тогда Тип_dateTime = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime"); Тип_string = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string"); ВебСервис = WSСсылки.SOAP.СоздатьWSПрокси("http://89.20.149.116/pcsupport/tm/soap", "getTicketsByDatewsdl", "getTicketsByDatewsdlPort"); getTicketsByDateData = ВебСервис.ФабрикаXDTO.Создать(ТипОбъекта); getTicketsByDateData.login = ФабрикаXDTO.Создать(Тип_string, "НашЛогин"); getTicketsByDateData.password = ФабрикаXDTO.Создать(Тип_string, "НашПароль"); getTicketsByDateData.from = ФабрикаXDTO.Создать(Тип_dateTime, НачалоГода(ТекущаяДата())); getTicketsByDateData.to = ФабрикаXDTO.Создать(Тип_dateTime, ТекущаяДата()); Результат = ВебСервис.getTicketsByDate(getTicketsByDateData); КонецЕсли; После выполнения кода ошибка: Ошибка при вызове метода контекста (getTicketsByDate) Результат = ВебСервис.getTicketsByDate(getTicketsByDateData); по причине: Ошибка вызова операции сервиса:Ошибка вызова операции сервиса: {http://89.20.149.116/pcsupport/tm/soap}:getTicketsByDatewsdl:getTicketsByDate() по причине: Неверный формат. Не могу понять из-за чего. |
|||
2
Apokalipsec
29.08.14
✎
12:08
|
w3c формат DateTime неправильно его передаешь.
|
|||
3
Apokalipsec
29.08.14
✎
12:10
|
||||
4
kan81
29.08.14
✎
12:20
|
сделал согласно описания - http://prntscr.com/4hkqvn
или это не то? |
|||
5
Apokalipsec
29.08.14
✎
12:23
|
(4) но передаешь-то ты туда дату криво. Посмотри как должна дата передаваться в (3).
|
|||
6
kan81
29.08.14
✎
12:48
|
getTicketsByDateData.from = ФабрикаXDTO.Создать(Тип_dateTime, "2014-01-01");
getTicketsByDateData.to = ФабрикаXDTO.Создать(Тип_dateTime, "2014-08-01"); все равно прежняя ошибка: Ошибка при вызове метода контекста (getTicketsByDate) Результат = ВебСервис.getTicketsByDate(getTicketsByDateData); по причине: Ошибка вызова операции сервиса: {http://89.20.149.116/pcsupport/tm/soap}:getTicketsByDatewsdl:getTicketsByDate() по причине: Неверный формат. |
|||
7
Apokalipsec
29.08.14
✎
13:21
|
(5) В твоем первом сообщении: timestamp, по умолчанию с самого начала UNIX-time. Попробуй передавать туда в таком формате строку: http://www.unixtimestamp.com/index.php
|
|||
8
kan81
29.08.14
✎
14:13
|
(7) Пробовал. Перепробовал все возможные варианты, ошибка все равно одна и та же выходит.
|
|||
9
yukon
29.08.14
✎
15:10
|
(6) А так пробовал:
getTicketsByDateData.from = Дата(2014,01,01); getTicketsByDateData.to = Дата(2014,08,01); Дата (Date) Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту определяется в пространстве имен {http://www.w3.org/2001/XMLSchema}. Имя типа XDTO: может быть любым из перечисленных: dateTime, date, time. |
|||
10
kan81
29.08.14
✎
15:33
|
(9) И так передавать пробовал, все равно одна и та же ошибка
Ошибка при вызове метода контекста (getTicketsByDate) Результат = ВебСервис.getTicketsByDate(getTicketsByDateData); по причине: Ошибка вызова операции сервиса: {http://89.20.149.116/pcsupport/tm/soap}:getTicketsByDatewsdl:getTicketsByDate() по причине: Неверный формат. Такое ощущение что 1С как-то не так передается параметр "getTicketsByDateData" или не в таком виде, хотя если смотреть через отладчик, типы совпадают. |
|||
11
yukon
29.08.14
✎
15:39
|
(10) Попробуй передать переменные как параметры, а не как свойства объекта:
Результат = ВебСервис.getTicketsByDate("НашЛогин", "НашПароль", Дата(2014,01,01), Дата(2014,08,01)); |
|||
12
kan81
29.08.14
✎
15:45
|
так тоже пробовал, в этом случае ошибка "Слишком много фактических параметров".
|
|||
13
hhhh
29.08.14
✎
15:47
|
||||
14
Эмбеддер
29.08.14
✎
15:50
|
(13) зачем оно здесь?
|
|||
15
Apokalipsec
29.08.14
✎
15:51
|
Косяк не в дате, можешь и фром и ту выпилить, они необязательные, смотри, что ещё криво передаешь.)
|
|||
16
Эмбеддер
29.08.14
✎
15:55
|
(11) там 1 параметр по схеме
|
|||
17
kan81
29.08.14
✎
16:13
|
(15) Да вроде отладчиком все проверял ( http://prntscr.com/4hm7at ) или не совсем то смотрю?
|
|||
18
Serginio1
29.08.14
✎
16:18
|
(10) Посмотри фиддлером что сервис возвращает
|
|||
19
hhhh
29.08.14
✎
16:20
|
(14) урок 2, полностью посвящен этой теме.
|
|||
20
kan81
29.08.14
✎
17:12
|
(18) Пробовал делать подобный запрос в SoupUI
stdClass Object ( [code] => 200 [message] => Новые заявки получены [tickets] => Array ( [0] => stdClass Object ( [ticket_id] => RKO11817 [price] => [status] => [status_info] => [execution_date] => [name] => test [phone] => 11111111111 [address] => 11111111111 [services] => [comment] => Настройка [created_at] => 2014-08-28T11:36:29+04:00 ) [1] => stdClass Object ( [ticket_id] => RKO11818 [price] => [status] => [status_info] => [execution_date] => [name] => тест [phone] => +7(111) 111-11-11 [address] => тестовая [services] => [comment] => тест [created_at] => 2014-08-28T11:38:19+04:00 ) ) ) |
|||
21
Serginio1
29.08.14
✎
17:42
|
Ну а судя по тому, что в 1С в get_tickets_response проблема с tickets tickets_list
Попробуй Помогите разобраться с web-сервисом |
|||
22
Эмбеддер
29.08.14
✎
18:07
|
(19) понятно. спасибо)))
|
|||
23
Эмбеддер
29.08.14
✎
19:47
|
у себя запустил то же самое. немного код переделал, чтобы запустилось во внешней обработке. судя по всему, 1С как обычно не может распарсить принимаемые данные штатными средствами
код был такой WSОпределения = Новый WSОпределения("http://89.20.149.116/pcsupport/tm/soap?wsdl"); Пакеты = WSОпределения.ФабрикаXDTO.Пакеты.Получить("http://89.20.149.116/pcsupport/tm/soap");//" target=""_blank"" rel=""nofollow"" class=""extralink"">http://89.20.149.116/pcsupport/tm/soap"";"); ТипОбъекта = Неопределено; Для i = 0 По Пакеты.Количество() - 1 Цикл Если СокрЛП(Пакеты.Получить(i).Имя) = "get_tickets_by_date_data" Тогда ТипОбъекта = Пакеты.Получить(i); КонецЕсли; КонецЦикла; Если ТипОбъекта <> Неопределено Тогда Тип_dateTime = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime"); Тип_string = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string"); ВебСервис = WSОпределения.Сервисы.Получить("http://89.20.149.116/pcsupport/tm/soap", "getTicketsByDatewsdl"); getTicketsByDateData = WSОпределения.ФабрикаXDTO.Создать(ТипОбъекта); getTicketsByDateData.login = ФабрикаXDTO.Создать(Тип_string, "НашЛогин"); getTicketsByDateData.password = ФабрикаXDTO.Создать(Тип_string, "НашПароль"); getTicketsByDateData.from = ФабрикаXDTO.Создать(Тип_dateTime, НачалоГода(ТекущаяДата())); getTicketsByDateData.to = ФабрикаXDTO.Создать(Тип_dateTime, ТекущаяДата()); getTicketsByDateData.Проверить(); ВСПрокси = Новый WSПрокси(WSОпределения, "http://89.20.149.116/pcsupport/tm/soap","getTicketsByDatewsdl","getTicketsByDatewsdlPort"); Результат = ВСПрокси.getTicketsByDate(getTicketsByDateData); КонецЕсли; |
|||
24
Эмбеддер
29.08.14
✎
19:48
|
опс, а я думал что такое target="_blank" и т.д- оказывается, движок мисты добавляет
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |