2009-05-19 14 views
5

Po prostu szukam informacji zwrotnej na temat najlepszych praktyk dotyczących projektowania interfejsu Web Service.Interfejs usługi WWW - typ złożony jako parametr?

że dwie opcje:

Option 1

public string GetSomeData(SomeCriteriaClass criteria); 

gdzie SomeCriteriaClass jest zdefiniowany jako:

public int ID; 
public string Name; 
public string Property2; etc. 

Wariant 2

public string GetSomeData(int id, string name, string property2) 

Która opcja jest preferowana? Wygląda to na konflikt wzorców projektowych - 1 polega na zawijaniu parametrów w klasie, ale drugim jest utrzymanie elastyczności i otwartości interfejsu usługi WWW.

Drugie pytanie brzmi - jeśli wybierzemy opcję 1 - jak nazwać to za pomocą adresu URL?

Dzięki

+0

Dlaczego mówisz, że opcja 2 "utrzymuje interfejs usługi internetowej elastycznie i otwarcie"? Oznacza to, że jakakolwiek zmiana parametrów danych wpłynęłaby na deklarację API, podczas gdy w opcji 1 miałaby ona wpływ tylko na deklarację "klasy parametrów" (i oczywiście kod wywołujący). –

+0

Przepraszam, to absolutnie słuszne, zamiast elastycznego i otwartego, które powinno brzmieć "widoczne i proste". Nie jestem pewien, jak nazwałbyś usługę sieciową przechodząc w złożonym typie za pośrednictwem adresu URL - więc to wpłynęło na mnie nieznacznie. Czy są wady, czy jest to bardziej skomplikowane? – Duncan

Odpowiedz

2

Możesz pójść twardo i zaimplementować opcję nr 1, używając SOAP. Za pomocą SOAP możesz definiować złożone typy danych. Z drugiej strony można to zrobić metodą "hack" jak w opcji # 2, używając REST i po prostu zakodować parametry w adresie URL lub komunikacie HTTP POST.

2

Termin "usługa sieciowa" jest często używany do dwóch różnych rzeczy.

  • Technologia: korzystanie z protokołu HTTP (S) jako protokołu komunikacji międzyprocesowej.

  • Podejście architektoniczne: Architektura zorientowana na usługi.

Jeśli mówimy o usługi internetowej, jak tylko technologia to masz wiele opcji: można używać HTTP GET (jest to jeden z użyciem URL params) lub HTTP POST (dane znajdują się w treść komunikatu HTTP). W przypadku HTTP POST ładunek danych może być SOAP lub po prostu dowolny materiał.

Jeśli mówimy o podejściu zorientowanym na usługi i usługach internetowych jako narzędziu, to najbardziej popularnym sposobem jest protokół HTTP + SOAP.

Jeśli weźmiemy pod uwagę metody usługi sieci Web tylko realizacja operacji usługi następnie użyć podpisu poniżej której podkreśla to podejście:

public FooResponse FooOperation(FooRequest request); 

oznacza to, że operacja ma wniosek i dokument odpowiedzi (nawet jeśli którekolwiek z nich są puste) i możesz oddzielić umowę o świadczenie usług (jakie operacje ci wystawisz) i umowę dotyczącą danych (w jaki sposób tworzymy komunikaty dotyczące żądań i odpowiedzi). Zobacz ten artykuł aby uzyskać więcej informacji o tym: Principles of Service Design Service Patterns and Anti-Patterns

Wniosek:

  • Jeśli nie dbają o SOA prostu chcesz wywołać metodę poprzez HTTP następnie Wariant 2 jest jasne i proste.
  • Ale jeśli budujesz usługi SOA, użyj podpisu "dokument-centric". Opcja 1 jest mieszaniną obu metod i nie jest zalecana.
+0

Dziękuję za to, zdecydowanie przeczytam o najlepszych praktykach SOA. Kiedy mówisz, że jest "niezalecany" - nadal nie jest tak źle, prawda ?! Nie widzę nic w tym łączu, które na przykład opisuje to jako antystrukturę. – Duncan

+0

Opcja 1 nie jest tak prosta, jak opcja 2, a nie tak zdyscyplinowana, jak podpis oparty na dokumencie, ale nie ma w niej nic złego. – Vizu

1

Opcja 1 publiczny ciąg GetSomeData (kryteria SomeCriteriaClass); to dobry sposób na wdrożenie usługi webservice, ponieważ używasz SOAP i terminów zorientowanych na dokumenty. A opcja 2 jest dla podstawowego programisty java, który nie koncentruje się zbytnio na wzorcu projektowym.

Załóżmy scenariusz - po użyciu opcji 2 załóżmy, że chcesz dodać 3 dodatkowe varibale w SomeCriteriaClass.java, w jaki sposób wybierzesz .. dodaj jeszcze 3 parametr do metody GetSomeData() lub zadeklaruj w SomeCriteriaClass.java.

Dobry wyznawca wzoru projektowego, zadeklaruj w SomeCriteriaClass.java, aby nie dodawać w GetSomeData().

+0

Dzięki. Czy mógłbyś podać mi przykład, jak nazwałbyś metodę za pomocą Opcji 1 za pośrednictwem adresu URL? – Duncan

Powiązane problemy