Pregunta

Actualmente estoy escribiendo un software web que también va a ser utilizado por los escritorios de los clientes a través de una API. El problema que estoy enfrentando en este momento es: ¿Debo poner en práctica todas las acciones de añadir / actualizar / eliminación de objetos en la aplicación dos veces? Una vez ya que se encuentra en el código normal y una vez aislado de la API?

O debería preferiría utilizar un sistema de clases del modelo programación orientada a objetos que representan todos los objetos en mi base de datos y los utilizan tanto para el API y el código normal?

o desarrollar la API de primera mano y usarlo desde mi interfaz web normal también?

Esto es algo que siempre me he preguntado acerca. Gracias de antemano!

¿Fue útil?

Solución

Hacer las cosas dos veces es casi siempre una mala idea - que es probablemente mejor de la implementación de la API, abriéndola hasta el usuario final, y también lo está usando para el código de cliente, así, con algunos ganchos adicionales para cosas que es específico para la interfaz.

Otros consejos

Esto es por lo que tenemos los protocolos del resto (y jabón).

El escritorio realiza peticiones fácil en sus aplicaciones web. Su aplicación web recibe las peticiones de reposo, y no el verdadero trabajo.

Su código existe exactamente en un solo lugar - la web

.

En primer lugar quiero decir que mi experiencia es con Django, que es un marco enriquecido de la web que ya ofrece un ORM. Tengo que crear modelos para representar los objetos de mi; Ejecuto sin sql prima.

Así que, naturalmente, yo recomendaría el segundo enfoque. De buenas a primeras Voy a decir que su tercer enfoque será un dolor de cabeza. ¿Por qué? Porque vas a querer hacer diferentes post-procesamiento. Esa es la naturaleza del juego. Cuando se pone una interfaz CRUD en la web, algunas cosas van a ser almacenados como campos en el modelo que el usuario ni siquiera reconocer a partir de la página CRUD. A modo de ejemplo, tengo una página CRUD de las noticias que tienen diferentes empresas asociadas a ella. (Esta es una clave externa de base de datos). Naturalmente, esta se suministra automáticamente por información de acceso. Pero el proceso para registrarse en la página web (y en ese inicio de sesión se almacena) será muy diferente que para una API remota.

Mi preferencia es combinar un poco de sus dos primeros enfoques. Hay sin duda debe haber acciones que deben ocurrir cada vez se guarda un objeto. Ponga los de un método save() (o update() y insert() si quieres romper las cosas un poco más). No se debe pensar en la implementación de esta funcionalidad en dos ocasiones.

Sin embargo, hay deserialización / construcción de objetos y validación que se producirá de manera diferente en la interfaz web y la API remoto. Esto realmente debería implementarse por separado.

También se podría mirar a la validación como intrínsecamente diferente de deserialización y considerar que algunas reglas serán los mismos y los demás serán diferentes. Por ejemplo, en una interfaz web, sé que cuando recibo la historia, estampar la modification_time mí mismo, mientras que para una API remota, confío en el cliente para estampar el tiempo. Esto es intencional. Por otro lado, cualquier historia que no tiene etiquetas en ella debe recibir una etiqueta default, independientemente de dónde viene. Es posible que prefiera la libertad de hacer objetos validadores a sólo conecte después de la construcción de objetos.

A ejemplo de código (en Python):

def handle_remote_update(serialized_object):
    #do some parsing
    model_object = ModelObject(...)#fill in with parsed values
    validator1.validate(model_object)
    validator3.validate(model_object)
    model_object.save()#All database code is in this method
    #If you have to log to your system or notify listeners, that's also in this method

def handle_web_submission(post_dict):
    #do some parsing
    model_object = ModelObject(...)#fill in with parsed values
    validator2.validate(model_object)#This wasn't executed above
    validator3.validate(model_object)#This was
    model_object.save()#Same code gets executed down here as above

Por supuesto, sólo he manejado el caso de insert o posiblemente update. Lo que necesita llamando es un poco de estas funciones divisor método, algo que sabe cuando la API remota está llamando insert frente delete y llama a una función diferente en consecuencia (y lo mismo para la interfaz web). Si está utilizando un framework de desarrollo web, esto podría bien ser su urlconfig para la parte de interfaz web.

REST se ha convertido en prácticamente un estándar para proporcionar una API a través de Internet para los clientes y le da mucha flexibilidad y el poder también. Si está trabajando en la plataforma .NET, en realidad se puede utilizar ASTORIA [ADO.Net los servicios de datos] que genera el servicio web basado en REST simplemente mapear los objetos de base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top