- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用最新的 Spring Boot 版本,当前为 2.2.2-RELEASE。
我有这个端点:
@RequestMapping(method = RequestMethod.POST, value = "/test", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ResponseEntity<?> post(@RequestParam(required = false) MultiValueMap<?, ?> paramMap) throws Exception {
// CODE
return new ResponseEntity<>(HttpStatus.OK);
}
如果我(从 postman )调用它,将正文设置为 x-www-form.urlencoded 一切都很好,我会收到 200 OK 状态代码。
但是如果我修改上述端点(添加另一个参数)如下:
@RequestMapping(method = RequestMethod.POST, value = "/test", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ResponseEntity<?> post(@RequestParam(required = false) MultiValueMap<?, ?> paramMap, RequestEntity<?> req) throws Exception {
// CODE
return new ResponseEntity<>(HttpStatus.OK);
}
我收到此错误:
{
"timestamp": 1576961587242,
"status": 415,
"error": "Unsupported Media Type",
"message": "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
"path": "/test"
}
有什么东西丢失了吗?
提前谢谢您。
最佳答案
正如 @Sunil Dabburi 建议调试 AbstractMessageConverterMethodArgumentResolver
中的 readWithMessageConverters
方法揭示了这个问题,一旦理解就会变得非常简单。 Spring 有大约 15 个默认消息转换器,它们负责将传入请求的内容转换为 RequestEntity
或 HttpEntity
。如果请求有主体,转换器会读取它并将其转换为它负责的对象类型。根据传入请求的媒体类型,每个转换器决定是否可以读取该请求。对于 application/x-www-form-urlencoded
媒体类型,默认的 Spring 转换器都无法处理此类请求。因此,就会出现上述错误。
将 application/x-www-form-urlencoded
媒体类型的自定义转换器添加到 Spring 的 http 消息转换器列表中可以解决该问题。在下面的示例中,自定义转换器仅负责读取请求,并且仅负责具有所需媒体类型的请求。
** 这些读取有助于理解媒体类型本身以及 spring 如何使用它,因此自定义转换器应该如何转换传入的请求:
以下是此类自定义 http 消息转换器的示例:
@Component
public class FormUrlencodedHttpMessageConverter extends
AbstractGenericHttpMessageConverter<MultiValueMap<String, String>> {
private static final MediaType CONVERTER_MEDIA_TYPE = MediaType.APPLICATION_FORM_URLENCODED;
public FormUrlencodedHttpMessageConverter() {
super(CONVERTER_MEDIA_TYPE);
}
@Override
public MultiValueMap<String, String> read(Type type, Class<?> contextClass, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
String urlEncodedData = new BufferedReader(
new InputStreamReader(inputMessage.getBody(), StandardCharsets.UTF_8)).readLine();
String[] keyValuePairs = urlEncodedData.split("&");
MultiValueMap<String, String> keyValuePairsMap = new LinkedMultiValueMap<>();
for (String keyValuePair : keyValuePairs) {
String[] pairElements = keyValuePair.split("=");
String key = pairElements[0];
String value = pairElements[1];
keyValuePairsMap.add(key, value);
}
return keyValuePairsMap;
}
@Override
protected boolean canRead(@Nullable MediaType mediaType) {
return CONVERTER_MEDIA_TYPE.includes(mediaType);
}
@Override
protected boolean canWrite(@Nullable MediaType mediaType) {
return CONVERTER_MEDIA_TYPE.includes(mediaType);
}
@Override
protected void writeInternal(MultiValueMap<String, String> t, Type type, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
throw new RuntimeException("Method 'writeInternal' in " + this.getClass().getSimpleName() + " is not implemented");
}
@Override
protected MultiValueMap<String, String> readInternal(Class<? extends MultiValueMap<String, String>> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException {
throw new RuntimeException("Method 'readInternal' in " + this.getClass().getSimpleName() + " is not implemented");
}
关于java - Spring Boot - 不支持内容类型 'application/x-www-form-urlencoded;charset=UTF-8',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59439782/
所以,据我所知,这个类并不存在于标准 Java 库中,而是 Dalvik 中的新增内容。这是正确的吗? 我认为这是 android 类“NdefRecord”包含对它的引用并使用它的原因,但无法将其导
我想创建一些处理编码的示例程序,特别是我想使用宽字符串,例如: wstring a=L"grüßen"; wstring b=L"שלום עולם!"; wstring c=L"中文"; 因为这些是
有人知道一种更快的方法来完成 java.nio.charset.Charset.decode(..)/encode(..) 的功能吗? 这是我目前使用的技术的瓶颈之一。 [编辑]具体来说,在我的应用程
我想创建一些处理编码的示例程序,特别是我想使用宽字符串,例如: wstring a=L"grüßen"; wstring b=L"שלום עולם!"; wstring c=L"中文"; 因为这些是
我正在检查代码并遇到以下行。 Charset.forName("ASCII") 但是当我查看 java documentation它只有 US-ASCII ISO-8859-1 UTF-8
初始化 PDO 时 - 我应该做:charset=UTF8 还是 charset=UTF8MB4? 这是我的初始化: $dsn = 'mysql:host=example.com;dbname=tes
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
据我所知,在 String.getBytes(charset) 中,参数 charset 表示该方法返回编码为给定字符集的字符串字节。 在 new String(bytes, charset) 中,第
我正在使用 sqlsrv 驱动程序连接到带有 PDO 的 MS SQL 服务器。 PHP 版本为 5.3.24。工作连接如下所示: $dsny = "sqlsrv:Server=xx1;Databas
我的算法有两个输入: 1 个将被编码的 utf8 String 对象 1 个字符集对象,指示我需要将字符串编码成什么 最后,返回的结果将被放入一个OutputStream,一个可能发生多次但至少一次的
获取多个字符集:text/json; Charset=UTF-8;charset=utf-8 OkHttp Header 调用 okHttp Library 服务器时。有人知道我该如何解决这个问题。
使用 firebug 时,我在我的 asp.net mvc 4 项目中收到此连线错误“NetworkError: 415 Cannot process the ...xt/xml; charset=u
当我尝试通过 ant 运行我的 TestNG 测试时,我得到了 java.lang.NoSuchMethodError: org.springframework.http.MediaType.getC
我正在使用 .NET 4.0 在 IIS 7.5 中托管 WCF 服务。我还有一个 WPF 应用程序,用作我的客户端,它是使用 Visual Studio 2010 和 .NET 4.0 构建的。我添
我一直在尝试向 soap 服务器发送正确的请求。我不断收到错误消息。 这是我的xml GET LAST REQUEST(添加换行符): 1 获取最后的回复: 请求 header : POST /
我在通过 ajax json 调用 WCF 服务时收到上述响应。我的调用代码是: $(document).ready(function () { $.ajax
我尝试使用独立应用程序使用 WCF Web 服务。我可以使用 Internet Explorer 查看此服务,也可以在 Visual Studio 服务引用中查看。 这是我遇到的错误 The cont
我使用独立应用程序创建了 WCF 服务并测试了 WCF 客户端。我能够使用 Internet Explorer 查看此服务,也能够在 Visual Studio 服务引用中查看。这是错误消息。 “响应
我们有一个在 HTTPS 上运行良好但在 HTTPS 上显示 HTTP 415 错误的网络服务。因此,在 HTTP 下,我们可以毫无问题地发送和接收 JSON 的 POST 请求。当我们在 HTTPS
我正在将 spring-boot 从 1.3.6 更新到 2.1.3,而之前响应的内容类型为 application/json;charset=UTF-8 ,现在我得到了一个 iso-8859-1 的
我是一名优秀的程序员,十分优秀!