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

如何将Spring Webclient内容类型设置为“application/json-patch+json”

农飞星
2023-03-14

我试图向另一个接受内容类型“application/json-patch+json”的API发出补丁rest请求。我正在使用Spring的webclient,但我无法让它工作。我不断得到“415不支持的媒体类型”

我试过下面的;

WebClient webClient = WebClient.create(baseUrl);
Mono<ClientResponse> response = webClient.patch()
  .uri(updateVmfExecutionApi, uuid)
  .header("Content-Type", "application/json-patch+json")
  .body(BodyInserters.fromFormData("lastKnownState", state))
  .exchange();

我也试过:

WebClient webClient = WebClient.create(baseUrl);
    Mono<ClientResponse> response = webClient.patch()
      .uri(updateVmfExecutionApi, uuid)
      .contentType(MediaType.valueOf("application/json-patch+json"))
      .body(BodyInserters.fromFormData("lastKnownState", state))
      .exchange();

对于这两种情况,我看到以下错误;

 {"timestamp":"2020-09-17T20:50:40.818+0000","status":415,"error":"Unsupported Media Type","exception":"org.springframework.web.HttpMediaTypeNotSupportedException","message":"Unsupported Media Type","trace":"org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported\n\tat org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:215)\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:421)\n\tat org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:367)\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.getHandlerInternal(RequestMappingHandlerMapping.java:449)

它似乎变成了'application/x-www-form-urlencoded;charset=utf-8',是否可能对此内容类型使用webclient?

共有1个答案

班承德
2023-03-14

如果你查看异常,你可以看到它说

Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

它将其更改为FormData。这是因为你实际上发送到身体里的东西有优先权。在您的代码中,您将声明以下内容以发送正文。

.body(BodyInserters.fromFormData("lastKnownState", state))

这表明您正在发送表单数据,这是发送数据的一种键值方式,然后webclient将自动为您设置内容类型标头为x-www-form-urlencoded

如果您希望有一个json内容类型头,则需要发送json数据。发送json是webclient的默认方式,所以您所需要做的就是正确地传入主体。有几种通过身体的标准方式。

通过传递一个生成器(可以是monoflux)。

.body(Mono.just(data))

使用BodyInserter#FromValue

.body(BodyInserters.fromValue(data))

或者是前一个的简写(这是最简单的)

.bodyValue(data)
 类似资料:
  • 是否可以将“默认内容类型”设置为“application/json;v=2.0”。我说 default 是因为我使用的是 HttpClient 类,并且我使用 DefaultRequestHeaders 将我的代理设置为默认值。 我按照这个例子来创建我的头https://stackoverflow.com/a/10679340/196526,但是我也使用版本控制,关于版本控制的信息保存在内容类型中

  • 问题内容: 我有一个映射有以下注释的控制器: 我返回了一个有效的JSON字符串,但是,当我在浏览器中的Chrome Dev Tools上查看响应时,内容类型不是唯一的。为什么未设置内容类型? 我的: 我的: 使用WildFly 8.1作为我的应用服务器。 问题答案: 要了解的第一件事是,在元素 仅用于限制请求处理程序的映射。 它什么也没做。 然后,假设您的方法的返回类型为,并带有注释,则将通过处理

  • 我有一个用以下注释映射的控制器: 我返回一个有效的JSON字符串,但是,当我在浏览器中的Chrome Dev Tools上查看响应时,内容类型不是,而是简单的。为什么没有设置内容类型? 我的: 我的: 使用Wildfly8.1作为我的应用服务器。

  • 嗨,有人能帮我处理这个错误吗?当我使用邮递员发送邮件请求时,这里是我的控制器 这就是我使用postman发送json的方式 我正在尝试搜索如何修复它,但错误仍然存在 编辑:这是邮递员的标题 提前致谢

  • 我正在尝试使用HttpClient创建以下帖子,使用postman它工作正常,但我似乎无法在代码中复制它。我需要将标题内容类型设置为application/json,并在文章正文中包含一个对象。 邮递https://mycompanyurl.com/authenticate 标题 键:内容类型,值:应用程序/json 正文{“username”:“someusername”,“password”:

  • 问题内容: 我正在开发一个React应用程序,并且正在使用fetch发送请求。我最近做了一个注册表单,现在将它与它的API集成在一起。以前,API接受url编码的数据,并且一切正常。但是现在需求已更改,API接受了JSON中的数据,因此我不得不将内容类型标头从“ application / x-www-form-urlencoded”更改为“ application / json”。但我收到以下错