2013-04-05 75 views
4

我正在爲以下問題尋求解決方案,涉及ServiceStack中的Swagger集成。ServiceStack&Swagger - ApiMember作爲路徑和查詢

我有我的RequestObject與必需的屬性ID。 我想提供以下路線:

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

基本上,這應該讓查詢字符串中或作爲的路徑ServiceConsumer提供ID的選擇。

Swagger用戶界面正確顯示了2個路由,但無法通過兩種方式進行測試,因爲API成員屬性不允許將其指定爲ParameterType'path'或'query'。

來源:https://gist.github.com/JohannesFerner/5317496

是否有任何方式,以提供API-會員規格,具體到根據路線或定義,它是作爲valdid路徑和查詢?

像這樣:

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

我的這種認識 - https://github.com/wordnik/swagger-core/wiki/Parameters - 是一個參數只能是「body」,「path」或「query」之一。並且參數名稱必須是唯一的。基於此,似乎不可能將參數表示爲「路徑」和「查詢」。 – paaschpa 2013-04-07 04:11:07

+0

謝謝,那也是我的理解。 似乎沒有辦法,爲兩種方式定義參數類型。 – 2013-04-09 08:02:14

回答

2

在這樣的情況下,我覺得最簡單的創建兩個單獨的DTO類,以促進揚鞭正確記錄每個路徑。 DTO類可能具有相同的屬性(在這種情況下爲Id,看起來像),以及不同的RouteApiMember屬性。您將有兩種服務方法,每種DTO都有一種服務方法,他們可以調用共享方法,傳遞Id屬性的值,以便大部分實現不會重複。

1

您可以多次提供ApiMember。因此,擴大你的例子:

[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; } 
} 

當然結果這一個規格爲兩條路線,無論是接受一個I​​D查詢參數或路徑PARAM。

如果使用招搖,CODEGEN這將不幸創建一個呼叫,看起來像這樣:

public GetTestId(int Id1, int Id2 = null)