【问题标题】:JSON Stringify 400 Bad Request on AJAX POSTAJAX POST 上的 JSON Stringify 400 错误请求
【发布时间】: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

标签: jquery ajax json post csrf


【解决方案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 方法,请确保您在服务器端处理相同

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多