|
Веб сервисы. Тип возвращаемого значения | ☑ | ||
---|---|---|---|---|
0
Zixxx
18.07.13
✎
13:18
|
Создал веб сервис, создал операцию NewEvent, тип возвращаемого значения указал из пакет как EventResponse.
В пакете для типа EventResponse создал два свойства 1. Error (string) 2. Description (string) В общем сервис работает хорошо и возвращает все нормально. Но мне следует учитывать что шибок может быть несколько, соответственно при ошибки сервис должен вернуть несколько ошибок в Description. Поэтому минимальное значение я ставлю 0, а максимальное -1. В итоге при самом ответе, после заполнения пакета получаю ошибку Ошибка проверки данных XDTO: Структура объекта не соответствует типу: {http://reforum.ru}EventResponse Проверка свойства 'Description': форма: Элемент имя: {http://reforum.ru}Description тип: {http://www.w3.org/2001/XMLSchema}string Не установлено значение одного из следующих свойств: Ошибка преобразования данных XDTO: Чтение объекта типа: {http://reforum.ru}EventResponse - [8,81] Проверка свойства 'Description': форма: Элемент имя: {http://reforum.ru}Description тип: {http://www.w3.org/2001/XMLSchema}string Неизвестная ошибка. Ошибка преобразования данных XDTO: Чтение объекта типа: {http://reforum.ru}EventResponse - [8,81] Проверка свойства 'Description': форма: Элемент имя: {http://reforum.ru}Description тип: {http://www.w3.org/2001/XMLSchema}string Ошибка вызова операции сервиса: {http://reforum.ru}:Site:NewEvent() Ошибка при вызове метода контекста (NewEvent) (1): Результат = Прокси.NewEvent(СоздатьЗначениеПараметраОперации(ПараметрыОперации[0])); В чем может быть проблема, почему не дает ответить списком? |
|||
1
Zixxx
18.07.13
✎
13:20
|
*ошибка выходит при возврате пакета, а не при заполнении как написал выше.
|
|||
2
Serginio1
18.07.13
✎
13:22
|
Ну а ты значения то установил для Description. Для того что бы не устанавливать значение установи минимальное значение я ставлю 0, а максимальное 1.
|
|||
3
Fragster
гуру
18.07.13
✎
13:24
|
обязательное заполнение где?
|
|||
4
Zixxx
18.07.13
✎
13:27
|
(3) Да вроде уже по разному пробовал
<xs:schema xmlns:tns="http://reforum.ru" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://reforum.ru" attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:complexType name="Event"> <xs:sequence> <xs:element name="ClientID" type="xs:string"/> <xs:element name="Data" type="xs:dateTime"/> <xs:element name="Type" type="xs:string"/> <xs:element name="Subject" type="xs:string"/> <xs:element name="Content" type="xs:string"/> <xs:element name="Result" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="EventResponse"> <xs:sequence> <xs:element name="Error" type="xs:boolean"/> <xs:element name="Description" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:schema> |
|||
5
Serginio1
18.07.13
✎
13:29
|
Покажи как устанавливаешь
|
|||
6
Fragster
гуру
18.07.13
✎
13:29
|
там еще nillable должно быть где-то
|
|||
7
Zixxx
18.07.13
✎
13:31
|
(5)
[CODE] ТипОбъектаEventResponse = ФабрикаXDTO.Тип("http://reforum.ru", "EventResponse"); EventResponse = ФабрикаXDTO.Создать(ТипОбъектаEventResponse); EventResponse.Error = СтруктураОшибки.Ошибка; Для Каждого СтрокаОшибки Из СтруктураОшибки.ОшибкаОписание Цикл EventResponse.Description.Добавить(СтрокаОшибки); КонецЦикла; Возврат EventResponse; [/CODE] |
|||
8
Serginio1
18.07.13
✎
13:33
|
(6) Но для nillable все равно нужно устанавливать значение в
ТипNull=ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema","anySimpleType"); СсылкаNull=ФабрикаXDTO.Создать(ТипNull); EventResponse.Description=ТипNull; (7) А если ошибки есть то проходит? |
|||
9
Fragster
гуру
18.07.13
✎
13:33
|
(7) нет, добавлять ты должен ЗначениеXDTO туда...
|
|||
10
acsent
18.07.13
✎
13:34
|
Эх не юзал бы я комплексные типы в таком виде. Один гемор от них
|
|||
11
Serginio1
18.07.13
✎
13:36
|
(9) Нет это необязательно если указан простой тип для свойства .
AkStringArrayType = ФабрикаXDTO.Тип("http://www.ACWebService.ru/sample", "AKStringArray"); Ответ = ФабрикаXDTO.Создать(AkStringArrayType); Для каждого стр из МейкПоОригиналу Цикл Ответ.Values.Add(стр) КонецЦикла; |
|||
12
Serginio1
18.07.13
✎
13:38
|
(10) До проще сделать тип StringArray и его установить для Description
|
|||
13
Fragster
гуру
18.07.13
✎
13:38
|
(11) у меня в свое время именно из-за этого не работало.
|
|||
14
acsent
18.07.13
✎
13:38
|
(10) сама 1с делает последовательности структур, а не таблицы
|
|||
15
Zixxx
18.07.13
✎
13:40
|
Так как мне сделать? Как в (8) тоже не работает.
|
|||
16
Serginio1
18.07.13
✎
13:40
|
(13) А какой тип был у свойства?
|
|||
17
Serginio1
18.07.13
✎
13:41
|
(15) А ту установил для него возможно пустое?
|
|||
18
Zixxx
18.07.13
✎
13:43
|
(17) Да, ошибка осталась
|
|||
19
Serginio1
18.07.13
✎
13:43
|
(15) Попробуй сделай тип StringArray и добавь свойство Description 0,-1
А для EventResponse Description сделай тип StringArray |
|||
20
Serginio1
18.07.13
✎
13:45
|
AkStringArrayType = ФабрикаXDTO.Тип(ПространствоИмен,"StringArray");
EventResponse.Description= ФабрикаXDTO.Создать(StringArrayType); |
|||
21
Zixxx
18.07.13
✎
13:45
|
(19) Нет типов StringArray в конфигураторе
|
|||
22
Serginio1
18.07.13
✎
13:49
|
(21) Ты его создай как в 19
|
|||
23
Zixxx
18.07.13
✎
13:50
|
(22) Не выходит что-то
Ошибка SOAP сервера: Unknown error. {ОбщийМодуль.МодульИнтеграции.Модуль(5104)}: Error calling context method (Создать) reason: {ОбщийМодуль.МодульИнтеграции.Модуль(5104)}: Error calling context method (Создать) reason: Type mismatch (parameter number '1') Ошибка вызова операции сервиса: {http://reforum.ru}:Site:NewEvent() Ошибка при вызове метода контекста (NewEvent) |
|||
24
Serginio1
18.07.13
✎
13:53
|
(23) а ты создал этот тип? Он должен быть таким как и EventResponse только без свойства Error
|
|||
25
Serginio1
18.07.13
✎
13:54
|
в 20 ошибка
StringArrayType = ФабрикаXDTO.Тип(ПространствоИмен,"StringArray"); EventResponse.Description= ФабрикаXDTO.Создать(StringArrayType); |
|||
26
Zixxx
18.07.13
✎
13:56
|
(25) Я ее поправил, в (23) ошибка на неправильный параметр в
|
|||
27
Zixxx
18.07.13
✎
13:56
|
ФабрикаXDTO.Создать(StringArrayType);
|
|||
28
Serginio1
18.07.13
✎
13:58
|
А ты создал этот тип StringArray?
|
|||
29
Serginio1
18.07.13
✎
14:03
|
Но вообще странно у меня есть тип который возвращает функция
<xs:complexType name="ListAKStringArray"> <xs:sequence> <xs:element name="Values" type="tns:AKStringArrayForList" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="AKStringArrayForList"> <xs:sequence> <xs:element name="AKStringArray" type="tns:AKStringArray"/> </xs:sequence> <xs:attribute name="Temp" type="xs:string" use="required"/> </xs:complexType> |
|||
30
Serginio1
18.07.13
✎
14:04
|
<xs:complexType name="AKStringArray">
<xs:sequence> <xs:element name="Values" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> |
|||
31
Fragster
гуру
18.07.13
✎
14:33
|
мой сервис такое отрабатывает:
Определение = Новый WSОпределения("http://fragster.ru/tmp/test.php?wsdl"); Сервис = Определение.Сервисы[0]; ПространствоИмен =Сервис.URIПространстваИмен; ТочкаПодключения = Сервис.ТочкиПодключения[0]; Прокси = Новый WSПрокси(Определение, ПространствоИмен, Сервис.Имя, ТочкаПодключения.Имя); Фабрика = Определение.ФабрикаXDTO; ТипТест = Фабрика.Тип(ПространствоИмен, "Test"); ОбъектТест = Фабрика.Создать(ТипТест); Для Сч = 1 по 10 Цикл ОбъектТест.str.Добавить("" + Сч); КонецЦикла; ОбъектРезультат = Прокси.testFunction(ОбъектТест); Для каждого Стр Из ОбъектРезультат.str Цикл Сообщить(Стр); КонецЦикла; |
|||
32
Fragster
гуру
18.07.13
✎
14:34
|
на стороне сервера правда не 1с...
/** * * @param Test $test * @return Test */ function testFunction(Test $test) { return $test; } |
|||
33
Fragster
гуру
18.07.13
✎
14:34
|
вернее
function testFunction(Test $test) { $test->str = array_reverse($test->str); return $test; } |
|||
34
Fragster
гуру
18.07.13
✎
14:37
|
в случае пустого массива 1с шлет
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header/> <soap:Body> <m:testFunction xmlns:m="http://fragster.ru/multithread"> <m:test xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> </m:testFunction></soap:Body> </soap:Envelope> |
|||
35
Serginio1
18.07.13
✎
14:37
|
(31) Сейчас не помню но если структура состоит только из одного элемента то проходит. А вот если типа как (0) то свойство должно бы типом как AKStringArray
|
|||
36
Fragster
гуру
18.07.13
✎
14:38
|
(35) смотри определение по ссылке
|
|||
37
Fragster
гуру
18.07.13
✎
14:39
|
(34)+ в случае заполненного:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header/> <soap:Body> <m:testFunction xmlns:m="http://fragster.ru/multithread"> <m:test xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <m:str>1</m:str> <m:str>2</m:str> <m:str>3</m:str> <m:str>4</m:str> <m:str>5</m:str> <m:str>6</m:str> <m:str>7</m:str> <m:str>8</m:str> <m:str>9</m:str> <m:str>10</m:str> </m:test> </m:testFunction></soap:Body> </soap:Envelope> |
|||
38
Fragster
гуру
18.07.13
✎
14:40
|
т.е. 1с куда-то теряет вообще весь параметр
|
|||
39
Serginio1
18.07.13
✎
14:45
|
(38) Это нормально, так как у тебя str объявлен как 0,-1
|
|||
40
Serginio1
18.07.13
✎
14:45
|
Для интереса добаввь в свою структуру еще поле
|
|||
41
Fragster
гуру
18.07.13
✎
14:46
|
(39) да не, это я тег m:test не заметил просто
|
|||
42
Fragster
гуру
18.07.13
✎
14:56
|
(40) тоже работает.
полный массив: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header/> <soap:Body> <m:testFunction xmlns:m="http://fragster.ru/testservice"> <m:test xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <m:single>одиночное свойство</m:single> <m:str>1</m:str> <m:str>2</m:str> <m:str>3</m:str> <m:str>4</m:str> <m:str>5</m:str> <m:str>6</m:str> <m:str>7</m:str> <m:str>8</m:str> <m:str>9</m:str> <m:str>10</m:str> </m:test> </m:testFunction></soap:Body> </soap:Envelope> пустой массив: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header/> <soap:Body> <m:testFunction xmlns:m="http://fragster.ru/testservice"> <m:test xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <m:single>одиночное свойство</m:single> </m:test> </m:testFunction></soap:Body> </soap:Envelope> |
|||
43
Serginio1
18.07.13
✎
15:11
|
А в 1С принимает?
|
|||
44
Fragster
гуру
18.07.13
✎
15:16
|
(43) не понял? я вызываю мой сервия из 1с. в ответ приходит объект того же типа. и с пустым и с полным массивом 1с не ругается (XMLки там почти одинаковые).
|
|||
45
Fragster
гуру
18.07.13
✎
15:16
|
одинаковые на вход и на выход. По структуре тегов - так вообще близнецы
|
|||
46
Fragster
гуру
18.07.13
✎
15:23
|
вот выход сервиса, который 1с нормально жрет (с пустым массивом):
output <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header/> <soap:Body> <m:testFunctionResponse xmlns:m="http://fragster.ru/testservice"> <m:return> <m:single>одиночное свойство</m:single> </m:return> </m:testFunctionResponse> </soap:Body> </soap:Envelope> |
|||
47
Serginio1
18.07.13
✎
15:36
|
(46) Ну значит топикастеру нужно указать какая у него версия. Кстати он куда то и пропал.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |