【问题标题】:Bad request AJAX post to Spring API错误的请求 AJAX 发布到 Spring API
【发布时间】:2019-04-29 05:43:41
【问题描述】:

我正在向我的 Spring API 发送 JSON 数据,但我总是收到错误的请求。我已经尝试了一些东西。起初,chanceReward 的类型是 Map<String, Object>。后来我认为它应该是String,但它仍然有一个错误的请求。我研究并认为我在注释中需要consumes = "application/json",但结果是一样的。不知道该怎么办了。下面是我的 API 的代码:

@RequestMapping(value = "/chance/{id}/saveChanceRewards", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public @ResponseBody Map<String, Object> saveChanceRewards(@PathVariable("id") String id,
        @RequestBody String chanceRewards) {

    try {
        JSONArray jsonArray = new JSONArray(chanceRewards);
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject JObject = jsonArray.getJSONObject(i);
            System.out.println(JObject.getString("name") + " " + JObject.getString("weight"));
        }
    } catch(JSONException e) {
        _log.error("Error parsing JSON");
    }

    Map<String, Object> map = new HashMap<String, Object>();
    // TODO

    return map;
}

下面是 ajax 代码(在 .jsp 中):

    let arrayRewards = [];
    // get the data from dynamic list of text fields
    for (let i = 1; i <= chanceRewardCount; i++) {
        arrayRewards.push({
            name: $('#chanceRewardName' + i).val(),
            weight: $('#chanceRewardWeight' + i).val()
        });
    }

    let data = {'data': arrayRewards};
    let jsonData = JSON.stringify(data);

    $.ajax({
        type: 'post',
        dataType: "json",
        data: data,
        contentType: 'application/json',    
        url: "${home}/chance/${id}/saveChanceRewards",
        method: 'post',
        success: function(response) {
            console.log('response', response);  
        },
        error: function(err) {
            console.log('error', err);
        }
    });

我正在使用 Spring Framework 3.2.1。

【问题讨论】:

    标签: json ajax spring jsp post


    【解决方案1】:

    400 Bad Request 错误是一个 HTTP 状态代码,表示您发送到网站服务器的请求(通常是加载网页请求等简单的请求)在某种程度上不正确或已损坏,服务器无法理解.

    这意味着服务器无法理解来自您的 ajax 的请求。

    首先,将@RequestBody String chanceRewards改为@RequestBody ChanceRewards chanceRewards

    并定义ChanceRewardsChanceReward 类。

    class ChanceReward {
    
        private String name;
    
        private String weight;
    
        // Getter Setter ...
    
    }
    
    class ChanceRewards {
    
        private List<ChanceReward> data;
    
        // Getter Setter ...
    
    }
    

    如果仍然失败,请尝试打开检查模式并单击网络选项卡以检查从 ajax 发送的请求。

    【讨论】:

    • 但是我发送的是 JSON 字符串化对象?不过好吧,我试试这个。
    • 我的媒体类型不受支持。我需要对 ChanceRewards 进行注释或做一些事情吗?
    • @Zik,也许你可以参考这个link在headers中设置接受应用程序类型?
    • @Zik,或者您可以尝试删除“consumes”,例如@RequestMapping(value = "/chance/{id}/saveChanceRewards", method = RequestMethod.POST, produces = "application/json"),因为我的应用程序在没有定义它的情况下仍然可以工作。最重要的是,您需要检查并检查请求头和内容是否正确发送。
    • 还是一样。对于请求头,是正确的。
    【解决方案2】:

    用反引号替换 url: "${home}/chance/${id}/saveChanceRewards", 中的双引号。

    【讨论】:

    • 试过了,不是问题
    【解决方案3】:

    这里发生了很多事情,所以让我们继续努力吧!

    首先,我看到您已将数据字符串化为 jsonData,但您实际的 ajax 帖子却使用了 data: data。轻松修复,只需换入正确的变量即可。

    我注意到的第二件事是您将奖励数组包装在 object 中(使用 data = {'data': arrayRewards}),但您的 Java 代码需要 数组本身 (JSONArray)就在请求正文之外。所以这也会抛出异常。如果不需要,您不必用对象包装数组。

    最后,您提到您总是收到“错误请求”,但您到底是什么意思? “HTTP 400”错误?其他一些 HTTP 错误?提供有关您在 javascript 端和 Java 服务器端看到的确切错误的更多信息可能会很有用。

    此时所有其他事情,例如担心创建 ChanceReward / ChanceRewards 类、接受/使用/生成标头等,都是多余的。它们是样板细节,您不需要它们中的任何一个即可正常工作。

    【讨论】:

    • 哦,我已经试过你的第一点和第二点了,还是不行。是的,我的意思是 HTTP 400 错误请求。当我在下面尝试 karfai 的解决方案时,我得到 415 Unsupported Media Type。
    • 所以我复制了你的代码,提出了我上面提出的两个建议,以确保 JS 和 Spring Boot 代码具有相同的期望,并且一切正常。如果您还有问题,请告诉我。关键是JS代码和Spring Boot代码要一致。如上所述,有两个不一致之处。
    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    相关资源
    最近更新 更多