Можно ли возвращать объекты из веб-службы?

StackOverflow https://stackoverflow.com/questions/11879

  •  08-06-2019
  •  | 
  •  

Вопрос

Есть ли способ вернуть классические объекты вместо возврата общей строки?Если не:каковы лучшие практики?Вы переносите свой объект в XML и перестраиваете объект на другой стороне?Каковы еще возможности?

Это было полезно?

Решение

Как уже упоминалось, вы можете сделать это в .net посредством сериализации.По умолчанию все собственные типы сериализуемы, поэтому это происходит автоматически.

Однако если у вас сложные типы, вам необходимо пометить объект атрибутом [Serializable].То же самое касается сложных типов в качестве свойств.

Так, например, вам нужно иметь:

[Serializable]
public class MyClass
{
    public string MyString {get; set;}

    [Serializable]
    public MyOtherClass MyOtherClassProperty {get; set;}
}

Другие советы

Если объект можно сериализовать в XML и описать в WSDL, тогда да, можно возвращать объекты из веб-сервиса.

Да:в .NET это называется сериализацией, при которой объекты сериализуются в XML, а затем реконструируются службой-потребителем обратно в исходный тип объекта или его суррогат с той же структурой данных.

Там, где это возможно, я транспонирую объекты в XML — это означает, что веб-сервис более портативен — тогда я могу получить доступ к сервису на любом языке, мне просто нужно создать синтаксический анализатор/транспозер объектов на этом языке.

Поскольку у нас есть файлы WSDL, описывающие службу, в некоторых системах это почти автоматизировано.

(Например, у нас есть сервер, написанный на чистом Python, который заменяет сервер, написанный на C, клиент, написанный на C++/gSOAP, и клиент, написанный на Cocoa/Objective-C.Мы используем SoapUI в качестве среды тестирования, написанной на Java).

Можно возвращать объекты из веб-службы с помощью XML.Но предполагается, что веб-службы не зависят от платформы и операционной системы.Сериализация объекта просто позволяет вам сохранять и извлекать объект из потока байтов, например файла.Например, вы можете сериализовать объект Java, преобразовать этот двоичный поток (возможно, с помощью кодировки Base 64 в поле CDATA) и передать его клиенту службы.

Но клиент сможет восстановить этот объект, только если он основан на Java.Более того, для сериализации объекта и его точного восстановления требуется глубокая копия.Глубокие копии могут быть дорогими.

Лучше всего создать схему XML, представляющую документ, и создать экземпляр этой схемы со спецификой объекта.

.NET автоматически делает это с сериализуемыми объектами.Я почти уверен, что Java работает точно так же.

Вот статья, в которой рассказывается о сериализации объектов в .NET:http://www.codeguru.com/Csharp/Csharp/cs_syntax/serialization/article.php/c7201

@Брайан:Я не знаю, как все работает на Java, но в .net объекты сериализуются в XML, а не в строки base64.Веб-служба публикует файл wsdl, содержащий определения методов и объектов, необходимые для вашей веб-службы.

Я надеюсь, что никто не создаст веб-сервисы, которые просто создают строку base64.

Дэниел Огер:
Как говорили другие, это возможно.Однако, если и служба, и клиент используют объект, который имеет одинаковое поведение домена с обеих сторон, вам, вероятно, не нуждалась в службе.

ломакс:Я должен не согласиться с этим, так как это несколько узкий комментарий.Использование веб -сервиса, которое может сериализовать объекты домена на XML, означает, что он облегчает клиентам, которые работают с одними и теми же объектами домена, но также означает, что эти клиенты ограничены использованием этой конкретной веб -службы, которую вы раскрываете, и также работает в Обратите внимание, позволяя другим клиентам не знать о ваших объектах домена, но все же взаимодействуют с вашим услугами через XML.

@ Ломакс:Вы описали два сценария. Сценарий 1: Клиент регидратирует XML-сообщение обратно в тот же объект домена.Я считаю, что это «возврат объекта».По моему опыту, это плохой выбор, и я объясню это ниже. Сценарий 2: Клиент преобразует XML-сообщение в нечто иное, чем тот же самый объект домена:Я на 100% за это, однако не считаю, что это возвращает объект домена.Это действительно отправка сообщения или DTO.

Теперь позвольте мне объяснить, почему истинная/чистая/не DTO сериализация объектов через веб-сервис обычно плохая идея.Утверждение:Прежде всего, чтобы сделать это, вы должны либо быть владельцем как клиента, так и службы, либо предоставить клиенту библиотеку для использования, чтобы он мог вернуть объекту его истинный тип.Проблема:Этот объект домена как тип теперь существует и принадлежит двум полусвязанным доменам.Со временем в одну область может потребоваться добавить поведение, которое не имеет смысла в другой области, и это приводит к загрязнению и потенциально болезненным проблемам.

Обычно я использую сценарий 2.Я использую сценарий 1 только тогда, когда для этого есть веская причина.

Прошу прощения за столь краткий первоначальный ответ.Я надеюсь, что это в некоторой степени проясняет мое мнение.Ломакс, казалось бы, мы наполовину согласны ;).

JSON — довольно стандартный способ передачи объектов в Интернете (как подмножество JavaScript).Во многих языках есть библиотека, которая преобразует код JSON в собственный объект — см., например. простой json в Python.

Дополнительные библиотеки для использования JSON см. Веб-страница JSON

Как говорили другие, это возможно.Однако если и служба, и клиент используют объект, который имеет одинаковое поведение в домене с обеих сторон, вам, вероятно, вообще не нужна служба.

Как говорили другие, это возможно.Однако, если и служба, и клиент используют объект, который имеет одинаковое поведение домена с обеих сторон, вам, вероятно, не нуждалась в службе.

Я вынужден с этим не согласиться, поскольку это несколько узкий комментарий.Использование веб-сервиса, который может сериализовать объекты домена в XML, означает, что это упрощает работу клиентов, работающих с одними и теми же объектами домена, но это также означает, что эти клиенты ограничены в использовании определенного веб-сервиса, который вы предоставили, и это также работает в наоборот, позволяя другим клиентам не знать об объектах вашего домена, но при этом взаимодействовать с вашим сервисом через XML.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top