当前位置: 首页 > 知识库问答 >
问题:

Swagger: GET请求中的Spring MVC模型

汝昀
2023-03-14

在MVC中,您可以期望控制器将接收模型作为输入,并将模型作为输出。在斯瓦格,后者不是问题,但我对前者有麻烦。我不明白如何让Swagger根据传入的GET参数建立输入模型。

考虑:

"paths": {
    "/search": {
        "get": {
            "consumes": [],
            "produces": [
                "application/json"
            ],
            "parameters": [
                // What goes here?
            ],
            "responses": {
                "200": {
                    "description": "Success",
                    "schema": { 
                        "$ref": "#/definitions/SearchResponse"
                    }
                },
            }
        }
    }
}

如何使生成的控制器的方法具有如下签名:

    public ResponseEntity<ResultModel> controllerGet(ModelFromParameters input);

其中ModelFromParameters将有几个字段对应于不同的GET参数。

示例主要关注POST请求或GET请求,其中20多个参数中的每一个都填充在方法的参数列表中,这显然是反MVC的。

所讨论的API是一个复杂的无状态查询系统,包含大量参数。

共有3个答案

薛兴德
2023-03-14

通常,超文本传输协议服务器(如tomcat、jetty)不会接受get请求中的正文消息。如果客户端需要通过超文本传输协议get方法向服务器传递参数,则应使用查询字符串。网址的最后一部分?性格。查询字符串详细信息可以看到查询字符串

但在SpringMVC帮助下,查询字符串中的http请求参数将绑定到控制器方法参数的字段。所以,客户端似乎向服务器端传递了一个pojo参数。

参数部分的任何方式应如下所示:

"parameters" : [ {
      "name" : "age",
      "in" : "query",
      "required" : false,
      "type" : "integer"
    }, {
      "name" : "firstName",
      "in" : "query",
      "required" : false,
      "type" : "string"
    }]

请注意,“in”字段的值是“query”。这意味着参数是通过查询字符串传递的。

臧欣怿
2023-03-14

我想你不能。我也有一个类似的问题,对于列表页面搜索,使用GET with body。如果它在Tomcat中起作用的话,就没有办法让招摇过市代表这一点;Elasticsearch也支持它。看来没有计划改变这方面的招摇过市。我在swagger中使用了拆分这两种方法:将没有搜索的列表作为GET,将搜索列表作为POST,只是为了将页面放在swagger文档中,如果后者实际上也作为GET工作的话。

我没有生成招摇过市代码的经验,但是,如果您的配置生成了POST所需的代码,但GET却没有,那么您可能遇到了相同的限制。

https://github.com/swagger-api/swagger-ui/issues/2867

https://github.com/swagger-api/swagger-ui/issues/2136

https://github.com/OAI/OpenAPI-Specification/blob/OpenAPI.next/versions/3.0.md#operationRequestBody

只有HTTP 1.1规范RFC7231明确定义了请求体的语义学的HTTP方法才支持请求体。在HTTP规范模糊的其他情况下,用户应该忽略请求体。

葛兴发
2023-03-14

假设:您希望创建一个对象作为服务方法的参数,但仍然在实际的超文本传输协议请求中传递对象的每个字段作为查询参数,并且能够昂首阔步地记录单个字段。

e、 得到http://localhost:8080/search?parameter1=value1

典型的服务方法定义每个查询参数被定义为实际方法中的参数

@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<List<String>> search(@RequestParam parameter1, @RequestParam parameter2) {
...
}

使用对象(又名Bean)修改了具有单个参数的服务方法,该对象注释为@Model属性。虽然它是一个对象,但就REST API而言,它仍然与上面相同。

@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<List<String>> search(@ModelAttribute FormParam formParam) {
...
}

FormParam类。您可以使用@ApiParam记录每个字段

public class FormParam {
    @ApiParam(value = "parameter1 - description here", required = true)
    private String parameter1;
    @ApiParam(value = "parameter2 - description here", required = true)
    private String parameter2;
    //define getter setters below
}

这是生成的swagger.json片段

"paths": {
    "/search": {
        "get": {
            "tags": ["search-service"],
            "summary": "Search with Object as parameter",
            "description": "Search with Object as parameter",
            "operationId": "searchUsingGET",
            "consumes": ["application/json"],
            "produces": ["*/*"],
            "parameters": [{
                "name": "parameter1",
                "in": "query",
                "description": "parameter1 - description here",
                "required": true,
                "type": "string"
            },
            {
                "name": "parameter2",
                "in": "query",
                "description": "parameter2 - description here",
                "required": true,
                "type": "string"
            }],
            "responses": {
                "200": {
                    "description": "OK",
                    "schema": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                },
                "401": {
                    "description": "Unauthorized"
                },
                "403": {
                    "description": "Forbidden"
                },
                "404": {
                    "description": "Not Found"
                }
            }
        }
    },

如果您手动创建swagger.json查询参数可以记录如下

"parameters": [{
    "name": "parameter1",
    "in": "query",
    "description": "parameter1 - description here",
    "required": true,
    "type": "string"
},
{
    "name": "parameter2",
    "in": "query",
    "description": "parameter2 - description here",
    "required": true,
    "type": "string"
}],
 类似资料:
  • 在SpringMVC项目中,客户机发送一个带有序列化对象的请求,客户机本身是一个小程序,所以它不希望收到一个web页面作为响应,而是一个带有字符串对象的响应,该响应将告诉他这是成功还是失败。那么解决方案是什么呢?我想在@Controller中使用返回void的方法,或者返回不存在页面的方法?(在这两种情况下,我还想知道是否有回复给客户)

  • 本文向大家介绍springmvc处理异步请求的示例,包括了springmvc处理异步请求的示例的使用技巧和注意事项,需要的朋友参考一下 springmvc 3.2开始就支持servlet3.0的异步请求。平常我们请求一个controller一般都是同步的,如果在代码执行中,遇到耗时的业务操作,那servlet容器线程就会被锁死,当有其他请求进来的时候就会受堵了。 springmvc3.2之后支持异

  • 我在我的SpringMVC项目中得到了这个错误。我必须在浏览器中手动添加完整的路径来运行代码,但我不能直接运行它。 web.xml:

  • 我在向spring mvc控制器发送请求时遇到了一些问题。我有实体: 我收到一个HTTP/1.1400错误请求: 我做错了什么?

  • 本文向大家介绍SpringMVC post请求中文乱码问题解决,包括了SpringMVC post请求中文乱码问题解决的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了SpringMVC post请求中文乱码问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 我们在页面难免提交一些中文数据给后台处理,但是发现后台拿到的数据乱码,可以

  • 本文向大家介绍springMvc请求的跳转和传值的方法,包括了springMvc请求的跳转和传值的方法的使用技巧和注意事项,需要的朋友参考一下 forword跳转页面的三种方式: 1.使用serlvet 2.使用Model对象 3.使用ModelAndView 当然也可以通过new 一个ModelAndView对象来实现 forword跳转到Controller中的方法: 跳转到相同类中的方法 跳