【问题标题】:AngularJS $http POST received as null variable in Java controller backendAngularJS $http POST 在 Java 控制器后端作为空变量接收
【发布时间】:2020-05-22 22:08:47
【问题描述】:

我希望从 AngularJS 发送数据,以便稍后在 Python+Java 后端使用它。问题是它被发送为空,我不知道为什么。谷歌浏览器的控制台没有错误,但我可以在我的 java 服务器控制台(mvn -P dev)中看到问题,我使用 return 来查看到达时变量的值:

DEBUG 13496 --- [XNIO-23 task-27] acpsaop.logging.LoggingAspect:退出:us.com.generic.web.rest.DataController.getData() 结果 = 变量“null”已保存

Java 控制器,从 AngularJS 获取信息:

@RestController
@RequestMapping("/api")
public class DataController {

    @RequestMapping("/data/")
    @ResponseStatus(code = HttpStatus.OK)
    public @ResponseBody String getData( @RequestParam(name="dataVariable", required=false) String dataVariable) {      

        return "The variable '" + dataVariable + "' was saved";
    }
}

AngularJS 控制器:

angular
    .module('Generic')
    .controller('DataController', DataController);

    DataController.$inject = ['$scope', '$http', 'URI', '$timeout'];

    function DataController ($scope, $http, URI, $timeout) {

        var myInformation = 'HeadStreet';       

        $http.post(URI + 'api/data/', {
            dataVariable: myInformation
        }, {
                withCredentials: true,
                headers: {
                    'Content-Type': 'charset=utf-8'
                }
            }).then(Success, Error);
        }

        function Success() {
           alert('Variable sent');
        }

        function Error() {
           alert('Issue while sending data');
        }
  }

【问题讨论】:

  • 我对 Spring 一无所知,但您的代码似乎正在读取 GET 参数,而不是 POST 参数。作为快速检查,请尝试使用URI + 'api/data/?dataVariable=HeadStreet' 快速找出是否是问题所在。 (您还可以在浏览器控制台中检查您的请求在客户端发送的内容)

标签: javascript java angularjs


【解决方案1】:

您将 dataVariable 作为 json 发布在请求的正文中。 @RequestParam 从查询参数中读取。

如果你想在正文中发布数据,你应该使用@RequestBody

你需要像下面这样创建一个 POJO 类

public class GetDataRequest{
   public String dataVariable;
}

然后在你的控制器中

@RequestMapping("/data/")
@ResponseStatus(code = HttpStatus.OK)
public @ResponseBody String getData( @RequestBody GetDataRequest request) {      

    return "The variable '" + request.dataVariable + "' was saved";
}

这应该可以工作

【讨论】:

    【解决方案2】:

    您在控制器中使用RequestParam,但您在 POST 请求的正文中发送数据。

    RequestParam 用于 URL 中的参数,例如/api/data?dataVariable=HeadStreet,但是你需要用@RequestBody阅读邮件正文,像这样

    @RestController
    @RequestMapping("/api")
    public class DataController {
    
        @RequestMapping("/data/")
        @ResponseStatus(code = HttpStatus.OK)
        public @ResponseBody String getData(@RequestBody YourDTO yourDTO) String dataVariable) {      
    
            return "The variable '" + yourDTO.dataVariable + "' was saved";
        }
    }
    

    以及对应的数据传输对象类

    class YourDTO {
        public String dataVariable;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多