|
Передача необязательных параметров в web-сервис | ☑ | ||
---|---|---|---|---|
0
ashamontev
25.04.14
✎
06:46
|
Приведу примитивный пример.
Есть сторонний web-сервис, для поиска неких данных по юридическим и физическим лицам. В нем три параметра. Первый PhysicalPerson - структура, описывающая физическое лицо. В ней есть обязательные поля, например паспортные данные Второй JuridicalPerson - структура, описывающая юридическое лицо. В ней есть обязательные поля, например ИНН. Третий параметр путь будет OrderNumber - номер заказа Этот сторонний web-сервис определяет данные кого искать по заполненности первых двух параметров. Если первый Null, а второй нет, тогда искать надо по юр. лицам. Если второй Null, а первый нет, тогда искать по физ. лицам. Если оба параметра не null, а соответствующие структуры (правильно заполнены), то ругается на то, что одновременно нельзя передавать данные по физ. и юр. лицам - один из параметров должен быть пустым. Передача в сервис Null вместо одного из параметров выдает ошибку несоответствия типов. Передача Неопределено (или пропуск параметра) выдает ошибку, что некорректно заполнена соответствующая структура (например, для структуры JuridicalPerson это будет "ИНН обязателен для заполнения 10 цифрами"). Видимо 1С создает объект XDTO и заполняет его дефолтными значениями. На C# и любом другом языке программирования создается экземпляр объекта JuridicalPerson и присваивается ему значение Null. Именно это и требует сторонний веб-сервис. Т.е. в сервис передается объект типа JuridicalPerson со значением Null. В 1С о таком даже и мечтать нельзя - увидеть в отладчике переменную какого-то типа со значением Null :) Может кто знает как это обойти? Очень не хочется поддерживать код в 1С и в какой-то прослойке, написанной на C# или любом другом языке программирования. Т.е. 1С будет дергать некий промежуточный сервис на моей стороне, а уже эта прослойка будет дергать сторонний сервис. P.S. позвонить в стороннюю компанию, чей сервис я юзаю, и попалакаться что у меня 1С и, поэтому, нужно переделать контракт метода или обязательность полей (или поднять новый сервис), не вариант. |
|||
1
ashamontev
25.04.14
✎
06:52
|
Забыл добавить, что платформа 8.3.4.408, если это имеет значение. Если на какой-то более поздней версии это исправлено, то подскажите, на какой.
|
|||
2
Wobland
25.04.14
✎
06:52
|
>В 1С о таком даже и мечтать нельзя - увидеть в отладчике переменную какого-то типа со значением Null :)
http://i.imgur.com/Liaw5KB.png |
|||
3
Dmitry1c
25.04.14
✎
06:57
|
>JuridicalPerson
(-_\\ |
|||
4
Dmitry1c
25.04.14
✎
06:58
|
>В 1С о таком даже и мечтать нельзя - увидеть в отладчике переменную какого-то типа со значением Null
Ещё как можно |
|||
5
Wobland
25.04.14
✎
07:05
|
телепатирую. у ТС нулл не включен в тип ЖуридикалПёрсон
|
|||
6
DitriX
25.04.14
✎
13:01
|
а пробовал вообще не заполнять, т.е. ничего не передавать?
|
|||
7
Serginio1
25.04.14
✎
13:42
|
||||
8
Serginio1
25.04.14
✎
13:43
|
Парамтры должны быть nullable
|
|||
9
Serginio1
25.04.14
✎
13:56
|
Тьфу nillable
|
|||
10
ashamontev
25.04.14
✎
21:19
|
> Wobland http://i.imgur.com/Liaw5KB.png
пример, в котором скрыта колоночка "Тип". Видимо 1С там не смог написать что-то отличное от Null. Не заполнять пробовал. Это аналогично тому, что отправить НЕОПРЕДЕЛЕНО. Только вот у сторонней организации такого типа нет и у них не проходит равенство на Null, что и вызывает в конечном итоге ошибку. Пробовал из 1С стукануться в сервис 1С с такими же параметрами и оказалось, что в сервисе значение необязательной переменной будет НЕОПРЕДЕЛЕНО. Понятно, что не в java ни в c# (не знаю на чем там этот сервис написан) нет такого значения переменной и скорее всего, туда доходит заполненный дефолтами объект, а не как нужно Null |
|||
11
su_mai
25.04.14
✎
21:45
|
(8) Точно! А еще должен наследовать интерфейс "INullable" :)
|
|||
12
Serginio1
25.04.14
✎
21:57
|
(10) В 1С неопределено соответсвует нормальному null.
1C Null это БД шный NULL. http://rsdn.ru/forum/db/5570744.flat И по БД шной логике (Null==8) будет Null Вообще параметр должен быть определен как nillable и тогда все будет проходить v8: Необязательный параметр web сервис |
|||
13
Wobland
26.04.14
✎
07:08
|
(10) видимо, так работает табло. не в курсе про тип нулл?
|
|||
14
ilpar
26.04.14
✎
07:23
|
Посмотри во что сериализуется Неопределено.
Потом посмотри во что сериализуется NULL из запроса. Эти результаты обсуди с разработчиками сервиса. |
|||
15
ashamontev
26.04.14
✎
20:43
|
Очень тяжело попросить стороннюю организацию "посмотреть" как к ним приходит Null и Неопределено
В wsdl эти параметры описываются так: xs:element type="r:PhysicalPersons" name="PhysicalPersons" minOccurs="0">-<xs:annotation> <!-- <xs:documentation>Лица, допущенные к вождению</xs:documentation> --> </xs:annotation></xs:element>-<xs:element type="r:JuridicalPerson" name="JuridicalPerson" minOccurs="0">-<xs:annotation> <!-- <xs:documentation>Юридическое лицо</xs:documentation> --> </xs:annotation></xs:element> В ws-ссылке 1С свойство "Возможно пустое" имеет значение истина. Вообщем, мне сказали, что веб-сервисы не самая сильная сторона 1С, и даже если я решу эту проблему, то возникут другие, что заставит писать промежуточный сервис на шарпе. Поэтому всем спасибо за помощь p.s. но очень бы хотелось узнать, как передать Null в веб-сервис :) |
|||
16
Serginio1
26.04.14
✎
21:16
|
(15) У тебя minOccurs="0"
Для передачи неопределено параметр должен быть nillable="true" Не надо тебе никакого промежуточного кода. Используй (7) и наслаждайся. |
|||
17
Serginio1
26.04.14
✎
23:22
|
Для тебя minOccurs="0" параметр может быть не установлен.
И это будет аналогично JavaSctipt unassigned. В структуре это поле просто отсутствует. В C# для такого поля создается дополнительное поле Specified или DefaultValueAttribute или Ссылочный тип, свойство IsNullable=false, либо свойство IsNullable не задано. http://msdn.microsoft.com/ru-ru/library/vstudio/zds0b35c(v=vs.100).aspx |
|||
18
etc
26.04.14
✎
23:31
|
(2) на твоем скринштоте вижу какой-то бред во второй строке:
Выражение:NULL=NULL Значение:Да ведь NULL <> NULL на сколько я помню. Именно для этого и ввели в SQL выражение <поле> IS NULL |
|||
19
Ksandr
26.04.14
✎
23:59
|
(15) >> мне сказали, что веб-сервисы не самая сильная сторона 1С
Дай угадаю кто тебе это сказал. Тебе сказали те кто их не осилил? |
|||
20
Serginio1
27.04.14
✎
00:43
|
(19) Ну да например v8: soap:Header
И еще куча спецификаций WS-* 1С не поддерживает. Например Ws-Security Ws-Reliable и др |
|||
21
ashamontev
27.04.14
✎
09:27
|
(17) параметр Specified действительно добавляется при работе с сервисом в C#, но для другого поля. И, как я понял, этот параметр означает "доверять или не доверять значению поля", а не "возможно пустое". Именно в этом сервисе при установке его в false значение параметра игнорируется сервисом при обработке и принимается по-умолчанию. И только Specified true "заставляет" сервис обработать переданное значение.
Как 1С обработает этот Specified, мне неизвестно. Может он всегда False туда подставляет и тут будет точно тупик. Поэтому меня и попросили "не терять времени" с сервисами на 1С, а сделать прослойку на C#, а для 1С выставить самый примитивный сервис, который он без труда обработает, а все специфические действия для сервиса внешнего контрагента сделает C# |
|||
22
Эмбеддер
27.04.14
✎
09:41
|
(18) в SQL условие NULL=NULL не выполняется, а на Си выполняется, так что в 1С это логично что тоже выполняется
|
|||
23
Serginio1
27.04.14
✎
11:33
|
(21) Понятиие доверять или не доверять это и есть установлено не установлено значение. В 1С тоже есть метод для просмотра установлено значение или нет.
Просто в твоем примере парамеитр minOccurs="0" но не nillable. И установка в null говорит о том что параметр нужно опускать. В итоге все равно передается структура. Я в итоге и сделал (7) что бы не мучатся с разного рода проблемами коих в те времена было огромное количество. v8: Объекты Net в IDispatch |
|||
24
Эмбеддер
27.04.14
✎
13:47
|
если поле не обязательное, я в 1С ставлю минимальное количество 0, максимальное -1. получается так
minOccurs="0" maxOccurs="unbounded" и когда я такую конструкцию обрабатываю gsoap (чтобы перевести в код Си), он правильно понимает, что поле необязательное |
|||
25
etc
27.04.14
✎
16:03
|
(24) да, только у тебя тогда поле может сколько угодно раз повторяться что в приципе нарушает валидацию файла.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |