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

spring boot controller可以接收纯/文本吗?

谭炎彬
2023-03-14

我试图用纯文本(utf-8)处理一个POST请求,但spring似乎不喜欢调用的纯文本性质。可能是它不受支持-或者是我编码错误吗?

@RestController
@RequestMapping(path = "/abc", method = RequestMethod.POST)
public class NlpController {
    @PostMapping(path= "/def", consumes = "text/plain; charset: utf-8", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Object> doSomething(@RequestBody String bodyText)
    {
        ...
        return ResponseEntity.ok().body(responseObject);
    }
}

回应是:

已解决[org.springframework.web.httpmediatypenotsupportedException:不支持内容类型'application/x-www-form-urlencoded']

我用curl命令进行了测试:

curl -s -X POST -H 'Content-Type: text/plain; charset: utf-8' --data-binary @text.txt localhost:8080/abc/def

txt包含纯文本(UTF-8希伯来语)。

共有1个答案

能向晨
2023-03-14

我想对spring是否支持text/plain这个问题的另一部分提出一些看法?

根据spring Docs:@RequestMapping注释中的“消费”或可消费媒体类型是什么

定义:

消耗品媒体类型

“您可以通过指定可使用媒体类型列表来缩小主映射范围。只有当内容类型请求标头与指定的媒体类型匹配时,该请求才会匹配。例如:”

@Controller
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
public void addPet(@RequestBody Pet pet, Model model) {
    // implementation omitted
}

也可以像在!text/plain中那样否定可消耗的媒体类型表达式,以匹配除内容类型为text/plain的请求之外的所有请求。

spring的媒体类型内部如何匹配?

Spring请求驱动设计以称为dispatcher servlet的servlet为中心,该servlet使用特殊bean处理请求,其中一个bean是RequestMappingHandlerMapping,它使用ConsumesRequestCondition类的getMatchingCondition方法检查媒体类型,如下所示。

    @Override
    public ConsumesRequestCondition getMatchingCondition(ServerWebExchange exchange) {
        if (CorsUtils.isPreFlightRequest(exchange.getRequest())) {
            return PRE_FLIGHT_MATCH;
        }
        if (isEmpty()) {
            return this;
        }
        Set<ConsumeMediaTypeExpression> result = new LinkedHashSet<>(expressions);
        result.removeIf(expression -> !expression.match(exchange));
        return (!result.isEmpty() ? new ConsumesRequestCondition(result) : null);
    }

get匹配条件类使用静态内部类ConsumesMediaType表达式,该表达式实际进行检查

     @Override
     protected boolean matchMediaType(ServerWebExchange exchange) throws UnsupportedMediaTypeStatusException {
    try {
        MediaType contentType = exchange.getRequest().getHeaders().getContentType();
        contentType = (contentType != null ? contentType : MediaType.APPLICATION_OCTET_STREAM);
        return getMediaType().includes(contentType);
    }
    catch (InvalidMediaTypeException ex) {
        throw new UnsupportedMediaTypeStatusException("Can't parse Content-Type [" +
                exchange.getRequest().getHeaders().getFirst("Content-Type") +
                "]: " + ex.getMessage());
    }}
if (helper.hasConsumesMismatch()) {
        Set<MediaType> mediaTypes = helper.getConsumableMediaTypes();
        MediaType contentType = null;
        if (StringUtils.hasLength(request.getContentType())) {
            try {
                contentType = MediaType.parseMediaType(request.getContentType());
            }
            catch (InvalidMediaTypeException ex) {
                throw new HttpMediaTypeNotSupportedException(ex.getMessage());
            }
        }
        throw new HttpMediaTypeNotSupportedException(contentType, new ArrayList<>(mediaTypes));
    }

根据IANA https://www.IANA.org/assignments/media-types/media-types.xhtml,Spring支持所有媒体类型。

 类似资料:
  • 问题内容: 标题说了。 如果我尝试将ServerSocket和SSLServerSocket绑定到同一端口,则会收到错误消息。如果客户端尝试连接到没有SSL的SSLServerSocket,则accept()方法将引发错误。如果客户端尝试通过SSL连接到ServerSocket,我不知道如何建立安全连接。 可能吗? 问题答案: 您可以接受普通的套接字连接,并在以后使用(在服务器端)将其升级到SSL

  • 我有这个Spring Rest APIendpoint: XML模型。 但没有任何内容打印到控制台中。知道我错在哪里吗?可能这个组件没有注册?

  • 问题内容: 使用Apache POI时,我(以编程方式)从MS Word文件获取的字符串与使用MS Word打开文件时看到的文本不同。 使用以下代码时: 输出是一行,其中包含许多“无效”字符(是,“框”)和许多不需要的字符串,例如“ ”,“ ”(“#”为数字),“ ”等。 以下代码“修复”了单行问题,但保留了所有无效字符和不需要的文本: 我不知道我是否使用错误的方法来提取文本,但这就是我在查看PO

  • 我已经试着解决了好几个小时了,但还是没能解决。我设置了这个editText,称为活动上的布局,并将其连接到活动上的变量,当您单击字段时,它会打开可视键盘,但当您按下一个键时,它会将您带到类似浏览器的搜索屏幕,而不只是更新editText的文本。 在我的xml编辑文本是: 在我这样做的活动中 我还是找不到办法让它不发生。你能帮助我吗?

  • 编辑:我不是在问是否可以从另一个调用一个lambda。

  • 问题内容: 我正在使用Express 3,并且想处理 文本/纯 POST。 Express 3 现在使用connect的bodyParser(我认为旧的Express代码已转移到connect)。bodyParser的文档提供了有关如何使其支持其他文件类型的一些详细信息。而且我找到了一篇很棒的博客文章,内容涉及在旧版本的Express中如何处理文本/纯文本。 我是否应该明确要求连接(并让节点的要求