none
WCF Rest: Operación GET con Body RRS feed

  • Pregunta

  • Buenos días, 

    Estoy realizando un servicio web con WCF, compatible tanto con SOAP como con REST (JSON y XML). Me ha surgido una duda en relación a los Métodos y uris para REST

    Lo expongo con mi caso:

    Tengo el siguiente DataContract:

    [DataContract]
        public class PersonData
        {
            [DataMember]
            public string personId;
    
            [DataMember]
            public string Name;
    
            [DataMember]
            public string Surnames;
    
            [DataMember]
            public byte[] Image;
    
            [DataMember]
            public string Nif;
    
            [DataMember]
            public string PersonalCode;
            
        }

    Y el siguiente ServiceContract:

    [ServiceContract]
        public interface IPersons
        {
            [OperationContract]
            [WebInvoke(Method = "GET", UriTemplate = "Persons/{personId}")]
            PersonData GetPerson(string personId);
    
            [OperationContract]
            [WebInvoke(Method = "POST", UriTemplate = "Persons/")]
            PersonData GetPerson(PersonData person);
    
            [OperationContract]
            [WebInvoke(Method = "POST", UriTemplate = "Persons/")]
            string UpdatePerson(PersonData person);
    
            [OperationContract]
            [WebInvoke(Method = "POST", UriTemplate = "Persons/")]
            string InsertPerson(PersonData person);
    
        }

    Obviamente los UriTemplate no están bien, ya que se repiten pero no sé como ponerlos exáctamente. Por qué?

    GetPerson(PersonData person);

    Al enviar un objeto (porque puedo buscar la persona por la imagen, en nif, etc) no puedo usar GET.

    InsertPerson(PersonData person);

    Según la definición de un servicio RESTFull, PUT soo se usaría cuando sepamos la url. Como InserPerson no sabe el id (lo genera el servidor), tendríamos que usar POST también para el INSERT.

    La solución sería crear uris del tipo:

    Persons/Update

    Persons/Insert

    Persons/Get

    Pero también rompe con los principios de RESTFull, ya que estamos especificando acciones.

    ¿Alguna idea o ejemplo de como soleis plantear estos casos?

    Un saludo,

    viernes, 12 de mayo de 2017 11:07

Respuestas

  • [ServiceContract]
    public interface IPersons
    {
    	[OperationContract]
    	[WebInvoke(Method = "GET", UriTemplate = "Persons/{personId}")]
    	PersonData GetPerson(string personId);
    
    	[OperationContract]
    	[WebInvoke(Method = "POST", UriTemplate = "Persons/")]
    	PersonData GetPerson(PersonData person);
    
    	[OperationContract]
    	[WebInvoke(Method = "POST", UriTemplate = "Persons/Update/")]
    	string UpdatePerson(PersonData person);
    
    	[OperationContract]
    	[WebInvoke(Method = "POST", UriTemplate = "Persons/New/")]
    	string InsertPerson(PersonData person);
    
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 12 de mayo de 2017 12:08
    Moderador