Question

Au lieu de renvoyer une chaîne commune, existe-t-il un moyen de renvoyer des objets classiques ?Sinon:quelles sont les bonnes pratiques ?Transposez-vous votre objet en XML et reconstruisez-vous l'objet de l'autre côté ?Quelles sont les autres possibilités ?

Était-ce utile?

La solution

Comme mentionné, vous pouvez le faire en .net via la sérialisation.Par défaut, tous les types natifs sont sérialisables, cela se produit donc automatiquement pour vous.

Cependant, si vous avez des types complexes, vous devez marquer l'objet avec l'attribut [Serialisisable].Il en va de même avec les types complexes en tant que propriétés.

Ainsi par exemple vous devez avoir :

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

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

Autres conseils

Si l'objet peut être sérialisé en XML et peut être décrit en WSDL alors oui, il est possible de renvoyer des objets à partir d'un service Web.

Oui:dans .NET, ils appellent cela la sérialisation, où les objets sont sérialisés en XML puis reconstruits par le service consommateur dans son type d'objet d'origine ou un substitut avec la même structure de données.

Lorsque cela est possible, je transpose les objets en XML - cela signifie que le service Web est plus portable - je peux ensuite accéder au service dans n'importe quelle langue, il me suffit de créer l'analyseur/transposeur d'objet dans cette langue.

Comme nous disposons de fichiers WSDL décrivant le service, cela est presque automatisé dans certains systèmes.

(Par exemple, nous avons un serveur écrit en python pur qui remplace un serveur écrit en C, un client écrit en C++/gSOAP et un client écrit en Cocoa/Objective-C.Nous utilisons soapUI comme framework de test, écrit en Java).

Il est possible de renvoyer des objets depuis un service Web en utilisant XML.Mais les services Web sont censés être indépendants de la plate-forme et du système d’exploitation.La sérialisation d'un objet vous permet simplement de stocker et de récupérer un objet à partir d'un flux d'octets, tel qu'un fichier.Par exemple, vous pouvez sérialiser un objet Java, convertir ce flux binaire (peut-être via un encodage Base 64 dans un champ CDATA) et le transférer au client du service.

Mais le client ne pourrait restaurer cet objet que s'il était basé sur Java.De plus, une copie complète est nécessaire pour sérialiser un objet et le restaurer exactement.Les copies complètes peuvent coûter cher.

Votre meilleur moyen consiste à créer un schéma XML qui représente le document et à créer une instance de ce schéma avec les spécificités de l'objet.

.NET le fait automatiquement avec les objets sérialisables.Je suis presque sûr que Java fonctionne de la même manière.

Voici un article qui parle de la sérialisation d'objets dans .NET :http://www.codeguru.com/Csharp/Csharp/cs_syntax/serialization/article.php/c7201

@Brian :Je ne sais pas comment les choses fonctionnent en Java, mais dans .net, les objets sont sérialisés en XML, pas en chaînes base64.Le service Web publie un fichier wsdl qui contient les définitions de méthode et d'objet requises pour votre service Web.

J'espère que personne ne crée de services Web qui créent simplement une chaîne base64

Daniel Auger :
Comme d'autres l'ont dit, c'est possible.Cependant, si le service et le client utilisent un objet qui a exactement le même comportement de domaine des deux côtés, vous n'aviez probablement pas besoin d'un service en premier lieu.

lomax :Je dois être en désaccord avec cela car c'est un commentaire un peu étroit.L'utilisation d'un service Web qui peut sérialiser les objets de domaine vers XML signifie qu'il facilite les clients qui travaillent avec les mêmes objets de domaine, mais cela signifie également que ces clients sont limités à l'utilisation de ce service Web particulier que vous avez exposé et qu'il fonctionne également dans Inversez en permettant à d'autres clients de ne pas avoir de connaissance de vos objets de domaine tout en interagissant avec votre service via XML.

@Lomax :Vous avez décrit deux scénarios. Scénario 1: Le client réhydrate le message XML dans exactement le même objet de domaine.Je considère que cela équivaut à "retourner un objet".D'après mon expérience, c'est un mauvais choix et je vais l'expliquer ci-dessous. Scénario 2 : Le client réhydrate le message XML dans autre chose que le même objet de domaine :Je suis à 100% derrière cela, mais je ne considère pas que cela renvoie un objet de domaine.C'est vraiment l'envoi d'un message ou d'un DTO.

Maintenant, laissez-moi vous expliquer pourquoi la sérialisation d'objets DTO vrai/pur/non sur un service Web est généralement Une mauvaise idée.Une affirmation :pour ce faire, vous devez soit être propriétaire à la fois du client et du service, soit fournir au client une bibliothèque à utiliser afin qu'il puisse réhydrater l'objet dans son vrai type.Le problème:Cet objet de domaine en tant que type existe désormais et appartient à deux domaines semi-liés.Au fil du temps, il faudra peut-être ajouter des comportements dans un domaine qui n’ont aucun sens dans l’autre domaine, ce qui entraîne une pollution et des problèmes potentiellement douloureux.

Je choisis généralement par défaut le scénario 2.Je n'utilise le scénario 1 que lorsqu'il y a une raison impérieuse de le faire.

Je m'excuse d'avoir été si laconique dans ma réponse initiale.J'espère que cela clarifie les choses dans une certaine mesure quant à mon opinion.Lomax, il semblerait que nous soyons à moitié d'accord ;).

JSON est un moyen assez standard de transmettre des objets sur le Web (en tant que sous-ensemble de javascript).De nombreux langages disposent d'une bibliothèque qui convertira le code JSON en objet natif - voir par exemple simplejson en Python.

Pour plus de bibliothèques à utiliser JSON, consultez le Page Web JSON

Comme d'autres l'ont dit, c'est possible.Cependant, si le service et le client utilisent un objet qui a exactement le même comportement de domaine des deux côtés, vous n'avez probablement pas besoin d'un service en premier lieu.

Comme d'autres l'ont dit, c'est possible.Cependant, si le service et le client utilisent un objet qui a exactement le même comportement de domaine des deux côtés, vous n'aviez probablement pas besoin d'un service en premier lieu.

Je ne suis pas d'accord avec cela car c'est un commentaire quelque peu étroit.L'utilisation d'un service Web capable de sérialiser des objets de domaine en XML signifie que cela facilite la tâche des clients qui travaillent avec les mêmes objets de domaine, mais cela signifie également que ces clients sont limités à l'utilisation du service Web particulier que vous avez exposé et qu'il fonctionne également dans inversez en permettant aux autres clients de n'avoir aucune connaissance de vos objets de domaine mais de continuer à interagir avec votre service via XML.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top