|
|
|
Добавление поля в прокси-класс через наследника.
|
|||
|---|---|---|---|
|
#18+
Есть WSDL, по которому сгенерированы прокси-классы. Реальный сервер возвращает дополнительное поле, которое отсутствует в WSDL, но которое хотелось бы получать на клиенте. При этом не хотелось бы менять ни WSDL, ни сгенерированные прокси-классы. WSDL обновляется и его нужно периодически заново загружать, поэтому пришлось бы повторять сделанные изменения при каждой загрузке. Примерный вид сгенерированных прокси-классов: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. В отдельном модуле был создан наследник: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Хотелось бы извлекать дополнительное поле следующим образом: Код: pascal 1. 2. 3. 4. и работать с ServerResult.NewField Возможно ли решить задачу, используя RegisterXSClass, RegisterExternalPropName, ... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2018, 16:57 |
|
||
|
Добавление поля в прокси-класс через наследника.
|
|||
|---|---|---|---|
|
#18+
авторРеальный сервер возвращает дополнительное поле, которое отсутствует в WSDL, но которое хотелось бы получать на клиенте Это разве не нарушение соглашения? авторВозможно ли решить задачу, используя RegisterXSClass, RegisterExternalPropName По идее возможно. Замените регистрацию ParentClass на ChildClass и добавьте регистрацию NewField ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2018, 17:10 |
|
||
|
Добавление поля в прокси-класс через наследника.
|
|||
|---|---|---|---|
|
#18+
Пробовал разные варианты параметров, но пока ничего не получилось. Примерный неработающий вариант: Код: pascal 1. 2. Это архитектурная особенность сервиса. Дополнительные поля могут быть разными и разрабатываются разными организациями, которые предоставляют XSD для них. При этом, по идее, при изменении как WSDL, так и XSD, нужно менять код только одного из них. Если бы удалось реализовать идею с наследником, то так бы и было. Сейчас реализован вариант, в котором ParentClass изменён напрямую, но при каждой загрузке WSDL все изменения нужно повторять вручную. Поэтому и возник вопрос, нельзя ли всё-таки сделать это через наследника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2018, 17:28 |
|
||
|
Добавление поля в прокси-класс через наследника.
|
|||
|---|---|---|---|
|
#18+
В стандартном фреймворке есть нюанс Есть код Код: pascal 1. 2. 3. 4. 5. 6. где Код: pascal 1. 2. Если сервер который отдает ответ document/literal стиль, то NodeTypeName = '' из-за чего NodeClass = nil и тогда парсинг идет по ветке Код: pascal 1. , где AClass есть ParentClass Если посмотреть в код GetElementType, то увидим, что Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. т.е. если сервер отдает ответ в стиле RPC/encoded то у ответа в теге будет аттрибут type, что-то вроде этого Код: xml 1. 2. 3. 4. 5. 6. 7. 8. И тогда можно зарегистрировать реализатор через Код: pascal 1. Либо договорится с сервером чтобы они клали туда аттрибут type с именем типа, по которому вы будете регистрировать в зависимости от организации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2018, 20:43 |
|
||
|
Добавление поля в прокси-класс через наследника.
|
|||
|---|---|---|---|
|
#18+
А нет.. я соврал... ClassToURI - это наоборот, по классу получить URI. Надо регистрировать через RegisterXSClass, но опять же это работает только для RPC/encoded ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2018, 20:54 |
|
||
|
Добавление поля в прокси-класс через наследника.
|
|||
|---|---|---|---|
|
#18+
Либо как вариант вы перегружаете SOAPToObject в вашем классе UseClass и уже сами решаете что и как будет использоваться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2018, 21:14 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=119&tid=2041306]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 341ms |

| 0 / 0 |
