Spring-Boot REST - 所需的字符串参数不存在

Posted

技术标签:

【中文标题】Spring-Boot REST - 所需的字符串参数不存在【英文标题】:Spring-Boot REST - Required String parameter is not present 【发布时间】:2016-09-21 02:29:57 【问题描述】:

所以,我正在尝试向本地 Spring MVC 项目发送 POST 请求,但每次尝试时,我都会收到 400: Bad Request,并在标题中指定错误。不知道为什么,因为当我检查发送的内容时,它是正确的。

Spring REST 控制器请求

@RequestMapping(value="/add", method = RequestMethod.POST)
void addPet(@RequestParam String name, @RequestParam String photo, @RequestParam String status) 
    Pet pet = new Pet(name, photo, status);
    this.petRepo.save(pet);

AngularJS 请求发送数据

$http(
       method: "post",
       url: "http://localhost:8080/pet/add",
       data:
           name: angular.element("#name")[0].value,
           photo: angular.element("#photo")[0].value,
           status: angular.element("#status")[0].value
       
    ).success(function(data, status) 

        )
        .error(function(data, status) 
            alert("Error");
            console.log(data);
            console.log(status);
        );

调用 AngularJS 函数的前端 html

<div class="form-group">
        <label for="name">Pet Name</label>
        <input type="text" class="form-control" id="name">
    </div>
    <div class="form-group">
        <label for="photo">Photo URL</label>
        <input type="text" class="form-control" id="photo">
    </div>
    <div class="form-group">
        <label for="status">Status</label>
        <input type="text" class="form-control" id="status" placeholder="Something descriptive like 'Available' or 'Taken'">
    </div>
    <div class="form-group">
        <div class="btn-group">
            <button type="button" class="btn btn-primary" ng-click="preview()">Preview</button>
            <button type="button" class="btn btn-success" ng-click="submit()">Submit</button>
            <button type="button" class="btn btn-danger" ng-click="clear()">Clear</button>
        </div>
    </div>

【问题讨论】:

下面发布的答案是一个改进,因为它不依赖于在指令之外进行 DOM 操作(通常是一件坏事),如果你放弃 jQuery 选择器不起作用并且真的与角度指令如何工作您很少需要选择器(如果需要,可以在大多数情况下使用 querySelector())。还要注意检查您的网络面板请求以查看有效负载(在底部)和来自服务器的响应,也可以使用 POSTMan 或 curl 进行测试以将角度或任何特定前端排除在等式之外。 打开你的浏览器网络标签,请求中发送了什么? @SotiriosDelimanolis name:"Pet" photo:"i.ytimg.com/vi/tntOCGkgt98/maxresdefault.jpg" status:"Available" @shaunhusain 在邮递员中测试给了我一个成功的请求。 @BrandonHewlett 嗯嗯嗯嗯....你有一个外部代理程序吗? (Charles Web 调试代理是我通常使用的,相信您可以代理带有额外扩展名或其他东西的邮递员请求)如果您可以在网络选项卡中获取两个 XHR 请求,您可以右键单击并保存 curl 然后使用diff 以查看发生了什么变化(可能是一些垃圾,但有些不同,这很重要)可能是标头或其他导致它无法正确解析有效负载(用于头韵)。 【参考方案1】:

您在后端使用 @RequestParam,但在 Angular 中,您将值放入请求的正文中。

您必须在后端使用@RequestBody 或调整前端以将值放入url 参数中。

【讨论】:

【参考方案2】:

找到答案。对于前端,我按照上面 SSH 的回答,对于后端,我将函数更改为:

void addPet(@RequestBody Pet pet)

【讨论】:

【参考方案3】:

这样试试

<div class="form-group">
      <label for="name">Pet Name</label>
<input type="text" class="form-control" ng-model="form.name" id="name">
   </div>
<div class="form-group">
    <label for="photo">Photo URL</label>
    <input type="text" class="form-control" ng-model="form.photo"  id="photo">
</div>
<div class="form-group">
    <label for="status">Status</label>
    <input type="text" class="form-control" ng-model="form.status"  id="status" placeholder="Something descriptive like 'Available' or 'Taken'">
</div>
<div class="form-group">
    <div class="btn-group">
        <button type="button" class="btn btn-primary" ng-click="preview()">Preview</button>
        <button type="button" class="btn btn-success" ng-click="submit(form)">Submit</button>
        <button type="button" class="btn btn-danger" ng-click="clear()">Clear</button>
    </div>
</div>

在控制器中使用这个

 $scope.form = "name":"","photo":"","status":""
 $http(
   method: "post",
   url: "http://localhost:8080/pet/add",
   data:
       name: $scope.form.name,
       photo: $scope.form.photo,
       status: $scope.form.status
   
).success(function(data, status) 

    )
    .error(function(data, status) 
        alert("Error");
        console.log(data);
        console.log(status);
);

【讨论】:

这会有什么不同?请澄清你的答案。 可能是您发送到服务器的数据与 RequestParam 字段类型不匹配。 请将该(或某个版本)编辑为您的答案。

以上是关于Spring-Boot REST - 所需的字符串参数不存在的主要内容,如果未能解决你的问题,请参考以下文章

如何添加 Weblate REST 翻译文件上传所需的权限?

将数据从 js 发送到 php、php 到 mysql 以及 REST json 响应时所需的正确编码/转义/htmlentities 是啥

使用 multer 文件输入的 axios 请求中不存在所需的请求部分“文件”

RestEasy 客户端所需的 jar

在带有 spring-boot rest 和 Swagger 的标头中使用 utf-8 字符时未加载响应

使用 HttpServletRequestWrapper 制作副本后缺少所需的请求正文