AJAX POST 中 JSON Stringify 返回 400 错误请求

6
我收到了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坏请求错误。这个错误是否可能是由于后端代码出问题或者请求发送到服务器时有问题?

JAVA实现

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

}

控制台中的响应错误消息是什么? - Thom-x
{"cause":null,"message":"无法处理托管/后向引用 'defaultReference':类型:值反序列化器类型 org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module$UriStringDeserializer 不支持它们"} - VIVEK MISHRA
您的服务器无法反序列化请求参数。基本上,您的请求无法与服务器已知的任何内容匹配。 - alcfeoh
我认为您需要将请求编码为所需的服务器格式。或者请求格式不正确。还要检查所期望的方法(POST、GET、PUT)是否正确。 - santify
您无需使用内容类型标头,因为已经使用了类型:json。 - siva
2个回答

6

如果您的数据中包含特殊字符,您需要在发送到服务器之前对数据进行编码。请尝试以下方法:

$.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而不是encodeURI。 "仅使用encodeURI无法形成正确的HTTP GET和POST请求,例如XMLHTTPRequests,因为"&"、"+"和"="未被编码,这些字符在GET和POST请求中被视为特殊字符。然而,encodeURIComponent可以对这些字符进行编码。" https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/encodeURI - vijay shiyani
为什么这个可以工作!?我们花了1周时间解决这个问题 - 谢谢。 - Gel
1
(从Angular的POST请求到JAVA服务器。这个有效。) - Gel

0

1.为什么需要将数据转换为字符串发送?可以直接发送原始数据。 2.由于数据类型已经定义为json,无需将内容类型设置为application/json。 3.如果你在这里使用了post方法,请确保你在服务器端进行了相应的处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接