2009-05-19 9 views
5

Solo estoy buscando comentarios sobre las mejores prácticas relacionadas con el diseño de la interfaz del servicio web.Interfaz del servicio web - Tipo complejo como parámetro?

I tiene dos opciones:

Opción 1

public string GetSomeData(SomeCriteriaClass criteria); 

donde SomeCriteriaClass se define como:

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

Opción 2

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

¿Cuál es la opción preferida? Parece que hay un conflicto de patrones de diseño: 1 es para envolver los parámetros en una clase, pero el otro es mantener la interfaz del servicio web flexible y abierta.

La segunda pregunta es - si elegimos la Opción 1 - ¿cómo se llama esto a través de una URL?

Gracias

+0

¿Por qué dices que la opción 2 "mantiene flexible y abierta la interfaz del servicio web"? Significa que cualquier cambio en los parámetros de datos afectaría la declaración de la API, mientras que en la opción 1 solo afectaría la declaración de "clase de parámetro" (y el código de llamada, por supuesto). –

+0

Lo sentimos, es correcto, en lugar de flexible y abierto, que debería haber sido "visible y directo". No estoy seguro de cómo llamaría a un servicio web que pasa un tipo complejo a través de una URL, así que eso me ha influenciado un poco. ¿Hay inconvenientes, lo hace más complejo? – Duncan

Respuesta

2

se puede ir por el camino difícil y poner en práctica la opción # 1, utilizando SOAP. Con SOAP puede definir tipos de datos complejos. Por otro lado, puede hacerlo de forma "pirata" como en la opción n. ° 2, usando REST y simplemente codificando los parámetros en la URL o en el mensaje HTTP POST.

2

El término "servicio web" a menudo se usa para dos cosas diferentes.

  • Tecnología: uso de HTTP (S) como protocolo para la comunicación entre procesos.

  • Un enfoque arquitectónico: arquitectura orientada al servicio.

Si estamos hablando de un servicio web como sólo una tecnología entonces usted tiene una gran cantidad de opciones: puede utilizar HTTP GET (este es el que utiliza params URL) o HTTP POST (los datos están en el cuerpo del mensaje HTTP). Para HTTP POST, la carga útil puede ser SOAP o simplemente cualquier cosa propia.

Si hablamos de un enfoque orientado al servicio y de servicios web como una herramienta, HTTP + SOAP es la forma más estándar de hacerlo.

Si se considera un método de servicio Web sólo una ejecución de una operación de servicio a continuación, usar la firma por debajo de la cual hace hincapié en este enfoque:

public FooResponse FooOperation(FooRequest request); 

Esto significa que una operación tiene una solicitud y un documento de respuesta (incluso si cualquiera de estos están vacíos) y puede separar el contrato de servicio (qué operaciones expone) y el contrato de datos (cómo redactar los mensajes de solicitud y respuesta). Consulta este artículo para más detalles al respecto: Principles of Service Design Service Patterns and Anti-Patterns

Conclusión:

  • Si no se preocupan por SOA sólo quieren invocar un método a través de HTTP a continuación, la opción 2 es clara y simple.
  • Pero si está creando servicios SOA, utilice la firma "documentada". La opción 1 es una mezcla de ambos y no es recomendable.
+0

Gracias por esto, definitivamente voy a leer las mejores prácticas de SOA. Cuando dices que no es "recomendado", todavía no es particularmente malo, ¿o sí? No veo nada en ese enlace que lo describa como un Antipatrón, por ejemplo. – Duncan

+0

La opción 1 no es tan simple como la opción 2 y no es tan disciplinada como la firma centrada en el documento, pero no tiene nada de malo. – Vizu

1

Opción 1 cadena pública GetSomeData (Criterios SomeCriteriaClass); es una buena manera de implementar el servicio web porque aquí está utilizando SOAP y el término orientado a documentos. Y la opción 2 es para el desarrollador básico de Java, los que no se concentran demasiado en el patrón de diseño.

Imaginemos: después de usar la opción 2, suponga que desea agregar 3 varillas más en SomeCriteriaClass.java, entonces, de qué manera elegirá ... agregue 3 parámetros más al método GetSomeData() o declare en SomeCriteriaClass.java.

Un buen seguidor de patrones de diseño, elija declarar en SomeCriteriaClass.java para no agregar GetSomeData().

+0

Gracias. ¿Podría darme un ejemplo de cómo llamaría un método utilizando la Opción1, a través de una URL? – Duncan

Cuestiones relacionadas