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

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支持所有媒体类型。

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

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

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

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

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

  • 6.6.3 FlatFileItemWriter 将数据写入到纯文本文件也必须解决和读取文件时一样的问题。 在事务中,一个 step 必须通过分隔符或采用固定长度的格式将数据写出去. LineAggregator 与 LineTokenizer 接口的处理方式类似, 写入文件时也需要有某种方式将一条记录的多个字段组织拼接成单个 String,然后再将string写入文件. Spring Batch