簡體   English   中英

Spring Rest Controller POST請求不起作用

[英]Spring Rest Controller POST request doesn't work

我有一個休息控制器:

@RestController
@RequestMapping("/query")
public class QueryController {

    @Autowired
    private QueryService queryService;

    @RequestMapping(value = "/select", method = RequestMethod.POST)
    public @ResponseBody QueryResultDTO executeQuery(@RequestBody QueryDTO queryDTO) {
        try {
            QueryResultDTO queryResultDTO = queryService.executeQuery("select * from employees");
            queryResultDTO.setSuccessful(true);
            return queryResultDTO;
        } catch (SQLException e) {
            QueryResultDTO queryResultDTO = new QueryResultDTO();
            queryResultDTO.setSuccessful(false);
            queryResultDTO.setErrorMessage(e.getMessage());
            return queryResultDTO;
        }
    }
}

我嘗試從AngularJS控制器發送POST請求:

app.controller("AppCtrl",function($scope,$http) {
    var app = this;

    $scope.execute= function () {
        $http({
            url: '../query/select',
            method: "POST",
            data: { 'message' : $scope.queryText }
        })
            .then(function(response) {
                    $scope.queryResult = response.data;
                    console.log($scope.queryResult);
                    console.log($scope.queryText)
                },
                function(response) {
                    console.log(response);
                });
    }

});

但它不起作用。 我甚至沒有調用Spring Controller中的executeQuery函數。

但是,當我將RequestMethod更改為GET時,它可以正常工作。

@RestController
@RequestMapping("/query")
public class QueryController {

    @Autowired
    private QueryService queryService;

    @RequestMapping(value = "/select", method = RequestMethod.GET)
    public @ResponseBody QueryResultDTO executeQuery() {
        try {
            QueryResultDTO queryResultDTO = queryService.executeQuery("INSERT INTO employee VALUES (7,'dupa')");
            queryResultDTO.setSuccessful(true);
            return queryResultDTO;
        } catch (SQLException e) {
            QueryResultDTO queryResultDTO = new QueryResultDTO();
            queryResultDTO.setSuccessful(false);
            queryResultDTO.setErrorMessage(e.getMessage());
            return queryResultDTO;
        }
    }
}

在Angular控制器中:

app.controller("AppCtrl",function($scope,$http) {
    var app = this;

    $scope.execute= function () {
        $http({
            url: '../query/select',
            method: "GET",
            data: { 'message' : $scope.queryText }
        })
            .then(function(response) {
                    $scope.queryResult = response.data;
                    console.log($scope.queryResult);
                    console.log($scope.queryText)
                },
                function(response) {
                    console.log(response);
                });
    }

});

我的主要問題是我想將一些數據發送到我的Spring控制器,然后發送JSON以響應我的Angular控制器。 Whith GET方法響應完美,但是當我使用POST ,控制器方法甚至都沒有被調用。

編輯:

我的QueryDTO類很簡單:

public class QueryDTO {

    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

還有一些DEBUG級別的日志:

2016-06-06 09:28:23.697 DEBUG 7504 --- [nio-8090-exec-2] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2016-06-06 09:28:23.698 DEBUG 7504 --- [nio-8090-exec-2] o.s.web.servlet.DispatcherServlet        : Successfully completed request

嘗試在方法中添加consumes=MediaType.APPLICATION_JSON_VALUE

@Transactional
@RequestMapping(value = "/userlogincheck", method = RequestMethod.POST,   consumes=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody void userLoginCheck(@RequestBody UserImpl user, HttpServletRequest request, HttpServletResponse response) throws JSONException, IOException {
JSONObject json = new JSONObject();
    try {
        String email=user.getEmail();
        Long userId=user.getId();
        User loginData = accountService.userLoginCheck(email,userId);
        if(loginData==null)
        {
            json.put("status", "FAILURE");
            json.put("message", "user does not exist");
            json.put("nextPage", "signIn");
        }
        else
        {
            json.put("status", "SUCCESS");
            json.put("nextPage", updateState);
        }
    }
    catch(Exception e) {
        logger.info(e.getMessage());
    }
    response.setContentType("application/json;charset=UTF-8");
    logger.info("response======" + json.toString());
    PrintWriter out = response.getWriter();
    out.write(json.toString());
}

我有同樣的問題,並且能夠通過向我的請求添加CSRF令牌來修復它(如果您使用的是WebSecurity,這只是一個問題)。 https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html

此鏈接描述了以下步驟:

1)將標記添加到標題中,使用百萬富翁執行如下操作(我認為您也可以從cookie中獲取標記):

<head>
   <meta name="_csrf" th:content="${_csrf.token}"/>
.....
</head>

2)將您的請求更改為包含CSRF令牌,如下所示(我不熟悉angular,但我猜您可以像使用Jquery一樣設置標題):

var token = $("meta[name='_csrf']").attr("content");
  $.ajax({
          type: 'POST',
          url: url,
          data: JSON.stringify(newTodo),
          headers: {
             'X-CSRF-TOKEN': token
          },
          contentType: 'application/json',
          dataType: 'json',
          success: function(){
            alert('callback ');
         }
      });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM