You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JAX-RS请求报错HTTP 415:不支持的媒体类型,求排查方案

解决AJAX请求HTTP 415 Unsupported Media Type错误

嘿,碰到415 Unsupported Media Type这种问题确实挺闹心的,我来帮你梳理下大概率的原因,结合你给出的代码片段来看,可能是这些地方没处理对:

1. 你设置的MediaType可能不符合后端预期

你提到用了text/html,但绝大多数WebService(尤其是REST风格的接口)并不会接受这个类型作为请求体的格式。常见的合法类型有两种:

  • application/json:如果后端期望接收JSON格式的数据(现在大部分REST接口都是这个)
  • application/x-www-form-urlencoded:如果后端接收传统的表单编码数据

text/html一般是用来返回HTML页面的,很少作为请求体的Content-Type,后端自然会拒绝。

2. 请求数据格式和MediaType不匹配

就算你设置了正确的MediaType,如果发送的数据格式不对,后端还是会报错。比如:

  • 你设了application/json,但直接传了表单序列化的字符串(比如$(form).serialize()的结果),而不是JSON字符串
  • 你设了表单编码类型,但传了未序列化的JSON对象

3. 更新请求的方法和路径可能有问题

从你的代码看,当存在idDisruptive时,你只是修改了URL,但请求方法还是POST——通常更新资源应该用PUT方法,部分后端框架会对不同HTTP方法的MediaType做不同校验,这也可能触发415错误。

修复示例代码

根据常见的两种场景,给你两个可行的代码示例:

场景一:后端期望JSON格式数据

$(document).on('submit','.form-add-edit',function(e){
    e.preventDefault();
    var $form = $(this);
    var idDisruptive = $form.find('input[name=idDisruptive]').val();
    var url = "api/disruptive";
    var method = "POST";

    // 把表单数据转成JSON对象
    var formData = {
        idDisruptive: idDisruptive,
        // 这里替换成你实际的表单字段
        title: $form.find('input[name=title]').val(),
        description: $form.find('textarea[name=description]').val()
    };

    if (idDisruptive){
        url = url + '/' + idDisruptive;
        method = "PUT"; // 更新用PUT更符合REST规范
    }

    $.ajax({
        url: url,
        method: method,
        contentType: "application/json", // 关键:设置正确的MediaType
        data: JSON.stringify(formData), // 必须转成JSON字符串
        success: function(response) {
            console.log("请求成功:", response);
            // 这里添加你的成功逻辑,比如刷新页面或提示
        },
        error: function(xhr, status, error) {
            console.error("请求失败:", error);
        }
    });
});

场景二:后端期望表单编码数据

$(document).on('submit','.form-add-edit',function(e){
    e.preventDefault();
    var $form = $(this);
    var idDisruptive = $form.find('input[name=idDisruptive]').val();
    var url = "api/disruptive";
    var method = "POST";

    var formData = $form.serialize(); // 直接序列化表单数据

    if (idDisruptive){
        url = url + '/' + idDisruptive;
        method = "PUT";
    }

    $.ajax({
        url: url,
        method: method,
        // jQuery默认就是这个类型,也可以不写
        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        data: formData,
        success: function(response) {
            console.log("请求成功:", response);
        },
        error: function(xhr, status, error) {
            console.error("请求失败:", error);
        }
    });
});

额外排查步骤

  • 先去看后端接口的文档,明确它支持的MediaType和数据格式
  • 打开浏览器开发者工具(F12),切换到Network标签,查看请求的Content-Type请求头和发送的Request Payload是否匹配
  • 如果是PUT请求,确认后端是否开启了PUT方法的支持(有些框架默认禁用PUT)

内容的提问来源于stack exchange,提问作者Pythorogus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:37:34