2009-01-10 4 views
5

Je suis encore en train d'apprendre à propos de REST et, dans mon test, j'ai trouvé ce scénario que je ne sais pas comment gérer.Comment ajouter de nouvelles données via un service REST opposé au service de style RPC?

J'ai un exemple de service WCF qui utilise Linq-to-Sql. C'est une base de données extrêmement simple avec une seule table appelée "Tâches" qui a quatre champs: Id, Description, IsCompleted et EnteredDate. (J'ai mentionné cela parce que je n'ai aucun contrat de données défini dans le service lui-même, tout vient du Contexte créé par Linq.)

Obtenir des données était trivial à convertir en REST ... tout comme la suppression de données. Cependant, l'insertion de nouveaux enregistrements ne semble pas aussi facile.

Mon opération de contrat RPC style ressemble à ceci:

[OperationContract] 
    void AddTask(string description); 

Le Id, IsCompleted et EnteredDate ne sont pas nécessaires comme la mise en œuvre du service ressemble à ceci:

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(); 
    } 

Le Id est un Identité et donc géré par la base de données.

Ma première pensée a été pour décorer le contrat d'exploitation comme celui-ci:

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

Mais je ne sais pas vraiment comment obtenir ce travail. Lorsque j'essaie d'utiliser Fiddler pour ajouter ceci, il renvoie un résultat de 411 (Length Required).

Quelle serait la bonne façon de procéder? Devrai-je réécrire l'implémentation pour accepter un document XML complet représentant le nouvel enregistrement?

Répondre

3

Résultats:

J'ai finalement trouvé un nice blog post qui m'a aidé à résoudre ce problème. Il s'avère que je faisais à peu près les choses correctement, mais je mettais le test dans Fiddler de manière incorrecte. J'ai aussi ajouté quelques détails à mon attribut.

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

Quand je mets mon Uri dans Fiddler il a besoin pour ressembler à ceci:

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

accepte maintenant correctement mon service les données et peut ajouter la tâche à la base de données.

0

Je pense que this décrit à peu près comment ajouter un élément à un conteneur d'une manière reposante.

+0

@thaggie: le lien ci-joint m'indique que mon UriTemplate et mon fonctionnement sont probablement valides, mais ne m'aident pas à résoudre mon problème. Je ne sais pas comment obtenir les données au service correctement. Par exemple, quel type de générateur de requêtes Fiddler utiliserait-il pour obtenir les données dans le service? –

0

En fonction des besoins, vous pouvez simplement activer le CRUD régulier via Astoria? J'ai une série couvrant la façon de le faire avec LINQ-to-SQL here. Juste une pensée.

+0

Ceci est intéressant car je n'avais pas encore vu ADO.NET Data Services en action. Cependant, il semble que plus de travail que ce que je cherchais. Il semble que je devrais être en mesure de faire ce que j'ai du travail en quelque sorte, ou peut-être changer la signature. –

0

Si vous voulez faire un service Web RESTful, n'utilisez pas d'application WCF. Modifiez votre modèle d'URI à quelque chose comme Task/new et placez les données de la nouvelle tâche dans le corps de la requête HTTP POST. J'implémente les services Web RESTful dans ASP.NET en tant que gestionnaires génériques (* .ashx). Cela me permet de préparer la méthode http et de partir de là.

kevin

Questions connexes