如何配置swagger使复杂的[FromUri] GET参数在Swagger中很好地显示

时间:2018-08-30 20:20:46

标签: c# rest swagger api-design

我已经设法弄清楚了大约一个星期。是时候问S.O. 我在这里有4个总体目标:

  1. 出于验证的原因,控制器代码需要使用ViewModel请求输入。 (控制器代码段)
  2. 我的API的客户端代码应使用不错的模型语法。 (客户端代码段)
  3. 对于庞大的UI页面,我希望“ Try me”界面可用。一堆文本框,或者一个用于JSON blob进行序列化和发送的文本区域。
  4. 获取请求

客户代码段:

var response = client.GetUserProductHistory(new Models.UserProductHistoryRequest() {
    Locale = "en-US",
    UserPuid = "FooBar"
});

控制器代码段

    [HttpGet]
    [HasPermission(Permissions.CanViewUserProductHistory)]
    public JsonPayload<UserProductHistoryResponse> GetUserProductHistory([FromUri]UserProductHistoryRequest model)
    {
        JsonPayload<UserProductHistoryResponse> output = new JsonPayload<UserProductHistoryResponse>();
        return output;
    }

我尝试使用[FromBody]。看起来不错,但出现错误消息“ GET请求不支持FromBody”。 我尝试使用[FromUri],但随后生成的客户端在生成的客户端中每次调用给了我15个方法参数。 我尝试使用[FromUri]和操作过滤器,以便将参数浓缩为Ref参数(由规范定义的复杂对象)。实际上,这对于客户端生成和服务器端都起到了不错的作用。问题是,大张旗鼓的用户界面看起来真的很la脚。您实际上不能很好使用的单个TEXT框。如果我能弄清楚如何使Swagger UI更改[FromUri]请求的外观,使其与[FromBody] UI更加匹配,那么我在这里将处于良好状态。有什么想法或现有的内容可以在这里指出正确的方向吗?

1 个答案:

答案 0 :(得分:2)

Swagger不是限制-REST本身就是限制。根据REST的定义,Web服务器应忽略所有HTTP GET方法上的传入请求正文。 ASP.NET强制执行此约定,这就是为什么您不允许在GET方法上使用[FromBody]的原因。

在设计REST API时,更好的做法是使用POST方法进行实际搜索。这将允许使用[FromBody],作为奖励,Swagger将按照您希望的方式运行。请参阅此处以获取支持意见:https://stackoverflow.com/a/18933902/66101