2013-04-05 1 views
4

Je cherche une solution pour le problème suivant, concernant l'intégration de Swagger dans ServiceStack.ServiceStack & Swagger - ApiMember comme chemin et requête

J'ai mon RequestObject avec un ID de propriété requis. Je veux fournir les itinéraires suivants:

[Route("/User/byId/{Id}", "GET", Summary = @"test", Notes = "test")] 
[Route("/User/byId", "GET", Summary = @"test", Notes = "test")] 

En gros, cela laisser le choix de fournir l'identifiant dans une chaîne de requête ou Chemin vers le ServiceConsumer. L'interface utilisateur de Swagger affiche correctement les 2 routes, mais elle n'est pas testable dans les deux sens, car l'attribut membre de l'API ne permet pas de le spécifier en tant que paramètre "chemin" ou "requête".

Source: https://gist.github.com/JohannesFerner/5317496

Est-il possible, de fournir une API-membre Spécification, en particulier à la Route selon, ou de définir qu'il est valdid comme chemin et Query?

Comme ceci:

[ApiMember(Name = "Id", ParameterType="path,query", Description = "User Id", DataType = "int", IsRequired = true)] 
+1

Ma compréhension de ce - https://github.com/wordnik/swagger-core/wiki/Parameters - est qu'un paramètre ne peut être que l'un de 'body', 'path' ou 'query'. Et un nom de paramètre doit être unique. Sur cette base, il ne semble pas possible d'avoir un paramètre représenté à la fois comme 'path' et 'query'. – paaschpa

+0

Merci, c'était aussi ma compréhension. On dirait qu'il n'y a aucun moyen de définir le paramètre parameterType dans les deux sens. –

Répondre

2

Dans les cas comme celui-ci, je trouve qu'il est plus facile de créer deux classes DTO séparées pour faciliter la documentation de chaque itinéraire correctement dans Swagger. Les classes DTO peuvent avoir des propriétés identiques (Id dans ce cas, il ressemble) et différents attributs Route et ApiMember. Vous auriez deux méthodes de service, une pour chaque DTO, et elles pourraient appeler une méthode partagée, transmettant la valeur de la propriété Id, de sorte que la majeure partie de l'implémentation ne soit pas dupliquée.

1

Vous pouvez fournir ApiMember plusieurs fois. Ainsi, sur l'expansion de votre exemple:

[Route("/User/byId/{Id}", "GET", Summary = @"test", Notes = "test")] 
[Route("/User/byId", "GET", Summary = @"test", Notes = "test")] 
public class TestRoute 
{ 
    [ApiMember(Name = "Id", ParameterType="path", Description = "User Id", DataType = "int", IsRequired = false)] 
    [ApiMember(Name = "Id", ParameterType="query", Description = "User Id", DataType = "int", IsRequired = false)] 
    public int Id { get; set; } 
} 

des résultats Ce cours dans une spécification pour deux voies, à la fois d'accepter une requête de param id ou chemin param.

Si vous utilisez fanfaronnades-Codegen cela malheureusement créer un appel qui ressemble à ceci:

public GetTestId(int Id1, int Id2 = null) 
Questions connexes