2009-01-10 10 views
5

Todavía estoy aprendiendo sobre REST y, en mi prueba, se me ocurrió este escenario que no sé cómo manejar.¿Cómo agregaría datos nuevos a través de un servicio REST opuesto al servicio de estilo RPC?

Tengo un servicio de muestra WCF que utiliza Linq-to-Sql. Es una base de datos tremendamente simple con una sola tabla llamada "Tareas" que tiene cuatro campos: Id, Descripción, IsCompleted y EnteroDate. (Mencioné esto porque no tengo contratos de datos definidos en el servicio en sí, todo proviene del Contexto creado por Linq.)

Obtener datos fue trivial convertir a REST ... como borrar datos. Sin embargo, insertar nuevos registros no parece tan fácil.

Mi operación de contrato de estilo RPC se ve así:

[OperationContract] 
    void AddTask(string description); 

El Id, IsCompleted y EnteredDate no son necesarios como la implementación del servicio se ve así:

public void AddTask(string description) 
    { 
     TaskListLinqDataContext db = new TaskListLinqDataContext(); 
     Task task = new Task() 
      { Description = description, IsCompleted = false, 
      EntryDate = DateTime.Now }; 

     db.Tasks.InsertOnSubmit(task); 
     db.SubmitChanges(); 
    } 

la identificación es una Identidad y, por lo tanto, manejada por la base de datos.

Mi primer pensamiento fue para decorar el contrato de operación como ésta:

[WebInvoke(Method="PUT", UriTemplate="tasks/{description}")] 
    [OperationContract] 
    void AddTask(string description); 

Pero no se sabe muy bien cómo conseguir que esto funcione. Cuando intento usar Fiddler para agregar esto, devuelve un resultado de 411 (longitud requerida).

¿Cuál sería la forma correcta de hacerlo? ¿Tendré que volver a escribir la implementación para aceptar un documento XML completo que represente el nuevo registro?

Respuesta

3

Resultados:

que finalmente encontraron una nice blog post que me ayudó a resolver este problema. Resultó que estaba haciendo las cosas correctamente pero estaba poniendo la prueba en Fiddler de forma incorrecta. También agregué algunos detalles más a mi atributo.

[WebInvoke(RequestFormat = WebMessageFormat.Xml, 
      ResponseFormat = WebMessageFormat.Xml, 
      Method = "POST", UriTemplate = "tasks/{description}", 
      BodyStyle = WebMessageBodyStyle.Bare)] 
[OperationContract] 
void AddTask(string description); 

Cuando pongo mi Uri en Fiddler se necesita para tener este aspecto:

http://ipv4.fiddler:8054/tasks/this+is+a+sample+desc+that+works

Ahora mi servicio acepta correctamente los datos y puede añadir la tarea a la base de datos.

0

Creo que this describe cómo agregar un artículo a un contenedor de una manera relajante.

+0

@thaggie: el enlace adjunto me dice que mi UriTemplate y el funcionamiento son probablemente válidos, pero no me ayudan a resolver mi problema. No sé cómo obtener los datos para el servicio correctamente. Por ejemplo, ¿qué tipo de Creador de solicitudes utilizaría Fiddler para obtener los datos en el servicio? –

0

Dependiendo de los requisitos, ¿podría simplemente habilitar CRUD regular a través de Astoria? Tengo una serie que cubre cómo hacer esto con LINQ-to-SQL here. Solo un pensamiento.

+0

Esto es interesante porque aún no había visto ADO.NET Data Services en acción. Sin embargo, parece que más trabajo es lo que estaba buscando. Parece que debería ser capaz de hacer lo que he trabajado de alguna manera, o posiblemente cambiar la firma. –

0

Si desea hacer un servicio web RESTful, entonces no use una aplicación WCF. Modifique su plantilla de URI a algo como Tarea/nuevo y coloque los datos de la nueva tarea en el cuerpo de la solicitud http POST. Implemento servicios web RESTful en ASP.NET como controladores genéricos (* .ashx). Esto me permite preparar el método http e ir desde allí.

Kevin

Cuestiones relacionadas