Este posibil să returnați obiecte dintr-un WebService?

În locul returnării unui șir comun, există o modalitate de a returna obiecte clasice? Dacă nu: care sunt cele mai bune practici? Vă transpuneți obiectul în xml și reconstruiți obiectul de cealaltă parte? Care sunt celelalte posibilități?

0
fr hi bn

11 răspunsuri

JSON este un mod destul de standard de a transmite obiecte în jurul web-ului (ca subset de javascript). Multe limbi dispun de o bibliotecă care va converti codul JSON într-un obiect nativ - a se vedea, de exemplu, simplejson în Python .

For more libraries for JSON use, see the JSON webpage

0
adăugat

Acolo unde este posibil, transpun obiectele în xml - aceasta înseamnă că serviciul Web este mai portabil - pot să accesez serviciul în orice limbă, trebuie doar să creez transposerul parser/obiect în acea limbă.

Deoarece avem fișiere WSDL care descriu serviciul, acest lucru este aproape automatizat în unele sisteme.

(De exemplu, avem un server scris în python pur care înlocuiește un server scris în C, un client scris în C ++/gSOAP și un client scris în Cocoa/Objective-C. Utilizăm soapUI ca cadru de testare, care este scrise în Java).

0
adăugat

Da: în .NET ei numesc această serializare, unde obiectele sunt serializate în xml și apoi reconstruite de serviciul consumator înapoi în tipul obiectului original sau un surogat cu aceeași structură de date.

0
adăugat

.NET face automat acest lucru cu obiecte care sunt serializabile. Sunt destul de sigur că Java funcționează la fel.

Here is an article that talks about object serialization in .NET: http://www.codeguru.com/Csharp/Csharp/cs_syntax/serialization/article.php/c7201

0
adăugat

După cum sa menționat, puteți face acest lucru în .net prin serializare. Implicit, toate tipurile native sunt serializabile, astfel încât acest lucru se întâmplă automat pentru dvs.

Cu toate acestea, dacă aveți tipuri complexe, trebuie să marcați obiectul cu atributul [Serializabil]. Același lucru este valabil și pentru tipurile complexe ca proprietățile.

Deci, de exemplu, trebuie să aveți:

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

    [Serializable]
    public MyOtherClass MyOtherClassProperty {get; set;}
}
0
adăugat

@Brian: Nu știu cum funcționează lucrurile în Java, dar în obiectele .net se serializează până la XML, nu și pe șirurile base64. Webservice publică un fișier wsdl care conține definițiile de metodă și de obiect necesare pentru webservice.

Sper că nimeni nu creează servicii web care să creeze pur și simplu un șir de bază64

0
adăugat

După cum au spus și alții, este posibil.   Cu toate acestea, dacă serviciul și serviciul   clientul utilizează un obiect care are   exact același comportament pe ambele domenii   părțile, probabil că nu ai nevoie de   serviciu în primul rând.

Trebuie să nu fiu de acord cu acest lucru, deoarece este un comentariu oarecum îngust. Folosirea unei webservici care poate serializa obiecte de domeniu în xml înseamnă că îi ușurează pe clienți care lucrează cu aceleași obiecte de domeniu, dar înseamnă că acei clienți sunt restricționați să utilizeze acel serviciu web pe care l-ați expus și de asemenea lucrează în invers, permițând altor clienți să nu aibă cunoștințe despre obiectele domeniului dvs., dar să interacționeze cu serviciul dvs. prin intermediul formularului XML.

0
adăugat

Dacă obiectul poate fi serializat în xml și poate fi descris în WSDL, atunci da este posibilă returnarea obiectelor dintr-o webservice.

0
adăugat

După cum au spus și alții, este posibil. Cu toate acestea, dacă serviciul și clientul utilizează un obiect care are exact același comportament de domeniu pe ambele părți, probabil că nu aveți nevoie de un serviciu în primul rând.

0
adăugat
    

Daniel Auger:
    După cum au spus și alții, este posibil.     Cu toate acestea, dacă serviciul și serviciul     clientul utilizează un obiect care are     exact același comportament pe ambele domenii     părțile, probabil că nu ai nevoie de     serviciu în primul rând.

  
     

Lomax:   Trebuie să nu fiu de acord cu asta, deoarece este a   o observație îngustă. Folosind un   webservice care poate serializa domeniul   obiecte pentru xml înseamnă că o face   ușor pentru clienții care lucrează cu   aceleași obiecte de domeniu, dar înseamnă și ele   că acești clienți sunt limitați la   folosind acel serviciu web particular   pe care le-ați expus și de asemenea lucrează în   invers, permițând altor clienți să   nu aveți nicio cunoaștere a domeniului dvs.   obiecte, dar încă interacționează cu dvs.   serviciu prin XML.

@ Lomax: Ați descris două scenarii. Scenariul 1: Clientul reincarcă mesajul xml înapoi în obiectul exact același domeniu. Consider că aceasta este "returnarea unui obiect". Din experiența mea, aceasta este o alegere proastă și o voi explica mai jos. Scenariul 2: Clientul rehidratase mesajul xml în alt obiect decât același obiect de domeniu: Sunt 100% în spatele acestui lucru, cu toate acestea nu consider că acest lucru a returnat un obiect de domeniu. Este într-adevăr trimite un mesaj sau DTO.

Acum, permiteți-mi să vă explic de ce serializarea reală/pură/non-DTO a unui serviciu web este de obicei o idee proastă. O afirmație: pentru a face acest lucru în primul rând, trebuie fie să fii proprietarul clientului și al serviciului, fie să oferiți clientului o bibliotecă pe care să o folosească astfel încât să poată rehidrata obiectul înapoi în adevăratul său tip. Problema: Acest obiect de domeniu ca un tip există acum și aparține a două domenii semi-conexe. Cu timpul, este posibil ca comportamentele să fie adăugate într-un domeniu care nu are sens în celălalt domeniu, ceea ce duce la poluare și la probleme potențial dureroase.

De obicei, am implicit scenariul 2. Folosesc scenariul 1 numai atunci când există un motiv copleșitor pentru a face acest lucru.

Îmi cer scuze că am fost atât de tare cu răspunsul meu inițial. Sper că acest lucru clarifică până la un anumit grad în ceea ce privește opinia mea. Lomax, se pare că suntem pe jumătate de acord;).

0
adăugat

Este posibilă returnarea obiectelor dintr-un serviciu web utilizând XML. Dar serviciile Web ar trebui să fie platformă și sistem de operare agnostic. Serializarea unui obiect vă permite pur și simplu să stocați și să preluați un obiect dintr-un flux de octeți, cum ar fi un fișier. De exemplu, puteți serializa un obiect Java, puteți converti acel flux binar (probabil printr-o encodare Base 64 într-un câmp CDATA) și transferați-l către clientul serviciului.

Dar clientul ar fi capabil să restabilească obiectul numai dacă ar fi bazat pe Java. Mai mult, este necesară o copie profundă pentru a serializa un obiect și pentru ao restabili exact. Copiile profunde pot fi costisitoare.

Cea mai bună rută este să creați o schemă xml care reprezintă documentul și să creați o instanță a acelei scheme cu specificul obiectului.

0
adăugat