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

对于生成json以外的内容类型的操作,招摇过市的UI导致HTTP 406不可接受的响应

卫胜
2023-03-14

我有一个与Jersey一起发布的REST API,并用Swagger进行了文档记录,我还有一个使用该API的Swagger UI安装。

我几乎所有的操作都会生成application/json并按预期工作,除了一个GET操作会生成:“text/plain;字符集=utf-8'

当我尝试从Swagger UI调用服务时,服务器会记录一个javax.ws.rs.NotAcceptableException并返回一个406响应。如果我从REST客户端调用相同的服务,它会按预期工作。

@GET
@Path("/text")
@Produces(MediaType.TEXT_PLAIN + ";charset=utf-8")
@ApiOperation(value= "Return text")
public Response getText(@QueryParam("user") String user) {
    return Response.ok(textService.getTextForUser(user)).build();
}

如果我更改为@Produces(MediaType.APPLICATION_JSON"; charset=utf-8"),那么它可以正常工作,但我不想设置错误的内容类型。

问题似乎在于,Swagger UI错误地将Accept标头设置为application/json,通过观察请求可以看出:

GET /supertext/text?user=1
...
Accept: application/json

使用rest客户端时,接受标头是:

GET /supertext/text?user=1
...
Accept: */*

为什么Swagger UI没有正确设置Accept标头?

这个可以配置吗?

共有2个答案

解鸿运
2023-03-14

我也遇到了同样的问题,但解决方案有所不同。

问题出在一个不相关的控制器上,它的映射没有正确定义。

启动spring boot应用程序时,我可以看到如下日志

([]) Mapping with class UnrelatedController

每当我加载Swigger UI时,都会发出一个请求Swigger的API,但是会显示对该API的响应,这与Swigger所期望的不匹配。

因此出现错误406

解决方案是纠正UnrelatedController的映射,一切都像以前一样工作。感谢Git历史!

林德惠
2023-03-14

似乎swagger用户界面在发现@Produces注释包含单个值时将接受标头设置为Application/json,否则它会在用户界面中呈现下拉列表以从可用内容类型中进行选择。

在swagger ui中。js公司:

opts.responseContentType = $("div select[name=responseContentType]", $(this.el)).val();

当下拉列表不存在时,属性将变为未定义。

在代码的后面,如果属性为null或未定义,则响应内容类型设置为application/json:

在swagger.js:

if (this.type === "POST" || this.type === "GET" || this.type === "PATCH") {
    if (this.opts.responseContentType) {
      responseContentType = this.opts.responseContentType;
    } else {
      responseContentType = "application/json";
    }
  }

因此,我的解决方案是修改swagger-ui.js中的代码,以确保设置了正确的内容类型,方法是探索生产数组并选择第一个元素作为响应内容类型:

在swagger ui中。js替换线路:

opts.responseContentType = $("div select[name=responseContentType]", $(this.el)).val();

使用:

if($("div select[name=responseContentType]", $(this.el)).val() === undefined) { 
    opts.responseContentType = opts.parent.model.produces[0];
}

else {
    opts.responseContentType = $("div select[name=responseContentType]", $(this.el)).val();
}
 类似资料:
  • 这似乎很奇怪,这并不像我预期的那样有效。我编写了一个简单的java类,它实现了可比接口并重写了compareTo()方法。但是,它不允许我传递Object以外的特定类型的参数。我在网上查看了其他人的代码,他们确实使用了其他类型的对象,我将他们的代码复制到eclipse中,但我仍然得到了同样的错误。 我的问题是;我必须做什么来比较这个对象和类型的对象,让我们说Person。比较器接口(compare

  • 我的pom.xml 招摇过市配置 服务器日志 它说映射: 但这些都不起作用(404): 如果我使用sping-fox较低版本,那么我将在我的日志中得到它已映射{[/v2/api-docs}],方法=[GET]。但是,我看不到在那里生成的任何json。

  • 我试图通过Swagger UI记录在供应商产品(WSO2 ESB)中开发的现有API服务,以供公司内部使用。供应商产品不支持招摇过市。我计划以编程方式检查/处理API服务的源代码(编写在供应商产品中),并在中生成一个包含swagger定义文件的目录/文件夹/库。json或。yml格式。那很好,我能做到。 这些api定义文件中的每一个都将在swagger UI中很好地呈现,我正在考虑使用https:

  • 我试图在我的微服务项目中生成一个单独的招摇过市,在Api网关中将所有服务招摇过市聚合成一个单独的招摇过市。为了实现这一点,我将遵循下一个教程https://objectpartners.com/2017/09/28/aggregate-services-into-a-single-swagger 这里的问题是,当我尝试设置绝对URL时,我收到的输出是未能加载API定义。未定义的http://loc

  • 如何仅显示类型为GET in Swagger page的API并隐藏其他API?我发现属性ApiExplorerSettings(IgnoreApi=true)可以从Swagger页面隐藏API,但是我有很多API要隐藏,我需要一种根据其HTTP类型隐藏API的方法。我尝试过这种方法: 但没用

  • 我使用Springfox从Spring Boot REST控制器生成了Swagger API规范。 我注意到一个问题,示例值/模型无法显示响应。 作为调查,我在http://localhost:8080/v2/api-文档,并在https://editor.swagger.io/,它也无法显示示例值/模型。这似乎是由于模式没有正确引用模型对象(“Car”)造成的。 但是从Swagger的API文档