AJAX POST 上的 JSON Stringify 400 错误请求

Posted

技术标签:

【中文标题】AJAX POST 上的 JSON Stringify 400 错误请求【英文标题】:JSON Stringify 400 Bad Request on AJAX POST 【发布时间】:2015-10-13 16:27:41 【问题描述】:

我收到 AJAX Post 方法的 400 Bad Request。我在后端使用 Spring Data Rest Services。下面是我在前端的 JS 代码

var url = "/udb/data/SecurityRoleGroup",
        groupData = id:"",name:"",accesslevel:"",roles:[];
        groupData.id = groupId.val();
        groupData.name = groupName.val();
        groupData.accesslevel = groupDescription.val();
        groupData.roles = multiselect_to.val();

        $.ajax(url,  type: 'POST',
            dataType: 'json',
            headers: 
                'X-CSRF-Token': _csrfGroup.val(),
                'Content-Type' : 'application/json'
            ,
            data: JSON.stringify(groupData),
            contentType: 'application/json',
        )
        .done(function(results) 
            showMessage.html("Group details are saved successfully.");
            showMessage.removeClass().addClass("alert alert-success").show();
        )
        .fail( function(xhr, textStatus, errorThrown)
            showMessage.html("Error : Rolegroup AJAX request failed! Please try again.");
            showMessage.removeClass().addClass("alert alert-danger").show();
        );

虽然我正在序列化 JSON 数据。我仍然收到 400 Bad Request 错误。如果某些代码在后端中断或发送到服务器的请求出现问题,是否会出现此错误?

JAVA 实现

@RepositoryRestResource(collectionResourceRel = "SecurityRoleGroup", path = "SecurityRoleGroup")
public interface SecurityRoleGroupRepository extends PagingAndSortingRepository<SecurityRoleGroup, Long> 


【问题讨论】:

控制台的响应错误信息是什么? "cause":null,"message":"无法处理托管/反向引用'defaultReference':类型:org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module 类型的值反序列化器$UriStringDeserializer 不支持它们" 您的服务器无法反序列化您的请求参数。基本上,您的请求无法与服务器已经知道的任何内容相匹配。 我认为您需要以所需的服务器格式对您的请求进行编码。或者请求格式不正确。还要检查方法(POST、GET、PUT)是否符合预期。 你不需要使用内容类型头,因为你使用了类型:json 【参考方案1】:

如果您的数据中有 spl 字符,则需要在发送到服务器之前对数据进行编码。试试这个

$.ajax(url,  type: 'POST',
                dataType: 'json',
                headers: 
                    'X-CSRF-Token': _csrfGroup.val(),
                    'Content-Type' : 'application/json'
                ,
                data: encodeURI(JSON.stringify(groupData)),
                contentType: 'application/json',
            )

【讨论】:

我会使用 encodeURIComponent insted of encodeURI。 “encodeURI 本身不能形成正确的 HTTP GET 和 POST 请求,例如 XMLHTTPRequests,因为“&”、“+”和“=”没有被编码,它们在 GET 和 POST 请求中被视为特殊字符。但是 encodeURIComponent , 确实对这些字符进行了编码。” developer.mozilla.org/en/docs/Web/javascript/Reference/… 为什么会这样!?我们在这个问题上花了 1 周时间 - 谢谢。 (从 Angular POST 请求到 JAVA 服务器。这行得通)。【参考方案2】:

1.为什么需要发送数据转换字符串可以直接发送数据 2.您不需要将内容类型设置为application/json,因为您在数据类型中定义为json 3.如果您在这里使用 post 方法,请确保您在服务器端处理相同

【讨论】:

以上是关于AJAX POST 上的 JSON Stringify 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章

请求正文为空,POST 节点 js ajax 调用 json Web 令牌

jquery .ajax 对 ruby​​ on rails 服务器的 post 请求在客户端出现 JSON.parse 错误

通过JQuery的$.ajax()把 json 数据 post 给 PHP

通过 POST (ajax) 发送 JSON 数据并从 Controller (MVC) 接收 json 响应

MVC中Ajax post Json和Ajax Get

原生Ajax与JSON实践二(Post请求)