【问题标题】:POST resquest not accepted while GET is being accepted接受 GET 时未接受 POST 请求
【发布时间】:2018-11-13 07:25:18
【问题描述】:

我正在尝试从 spring 控制器中的 angularjs 进行 http 调用并发布 json 数据,但我在 angularjs 中收到此错误:

angular.js:10661 POST http://localhost:8080/shopng/product/add 404 (Not 
Found)
(anonymous) @ angular.js:10661
sendReq @ angular.js:10480
serverRequest @ angular.js:10187
processQueue @ angular.js:14634
(anonymous) @ angular.js:14650
$eval @ angular.js:15916
$digest @ angular.js:15727
$apply @ angular.js:16024
(anonymous) @ angular.js:23416
eventHandler @ angular.js:3293
product_service.js:35 Error while adding product
product_controller.js:30 {productName: "ads", productPrice: 34, description: "ads", imageUrl: "asd"}

但是当我使用 GET 请求时,它没有给我任何错误,但它说不支持媒体类型,当我删除媒体类型并执行时,数据库中添加了“NULL”值。

这是我的 RestController:

@RestController
@RequestMapping("/product")
public class ProductRestController {
@Autowired
ProductDao productDao;
//Add Product

 @RequestMapping(value = "/add", method= RequestMethod.POST, consumes="application/json")
    public ResponseEntity<Void> createProduct(@ModelAttribute("product") Product product) {
        System.out.println("Creating Product " + product.getProductName());

        if (productDao.isProductExit(product)) {
            System.out.println("A Product with name " + product.getProductName() + " already exist");
            return new ResponseEntity<Void>(HttpStatus.CONFLICT);
        }

       productDao.add(product);

       return new ResponseEntity<Void>(HttpStatus.CREATED);
    }

这是我的 Angular 的服务请求:

function addProduct(product){
    var deferred = $q.defer();
    $http.post('http://localhost:8080/shopng/product/add', product)
        .then(
           function(response){
               deferred.resolve(response.data);
           },
           function(errResponse){
               console.log('Error while adding product');
               deferred.reject(errResponse);
           }

        );
    return deferred.promise;
 }

这是我的项目 github 仓库:https://github.com/Bk073/Shopping 任何帮助将不胜感激。

【问题讨论】:

  • 您确定您的映射正确吗?你可以发布你的完整控制器,包括类上的请求映射。
  • 这个问题与spring boot有关,与angularjs无关。
  • @IndraneelBende 感谢您的回复,是的,映射是正确的。我已经发布了相同的问题,我将与您分享链接,您可以查看所有值。 stackoverflow.com/questions/50658617/…
  • @IndraneelBende 这也是同样的问题,只是 servlet 不同,即在这种情况下是“localhost:8080/shopng”,而在这种情况下是“localhost:8080/shopping”
  • 在那个例子中我看不到你在哪里添加 /shopng 或 /shopping 在其余控制器中

标签: java angularjs spring http spring-mvc


【解决方案1】:

我已经完成了你的 securityconfig 课程。

请按以下方式禁用 csrf。

http.authorizeRequests().antMatchers("/admin/**")
    .access("hasRole('ROLE_ADMIN')").and().formLogin()
    .loginPage("/login").failureUrl("/login?error")
    .usernameParameter("username")
    .passwordParameter("password")  
    .and().logout().logoutSuccessUrl("/login?logout")
    .and().csrf().disable();
    //.and().exceptionHandling().accessDeniedPage("/403");

您得到 404 - 因为 csrf 检查抛出异常。要处理该异常,您尚未添加异常处理程序。所以 404 意味着 - 找不到异常处理程序,而不是 post 请求本身。

如果您需要使用 csrf 进行保护,请记住在请求中发送 csrf 令牌。

请参阅下面的附件并成功响应。

更新代码https://github.com/supun/Shopping

【讨论】:

  • 非常感谢,我花了 3 天时间,现在可以正常工作了
【解决方案2】:

控制器中的 value 属性不正确。它应该以 / 开头。请在您的控制器中更改为 /add

//Add Product

 @RequestMapping(value = "/add", method= RequestMethod.POST, consumes="application/json")
    public ResponseEntity<Void> createProduct(@ModelAttribute("product") Product product) {
        System.out.println("Creating Product " + product.getProductName());

        if (productDao.isProductExit(product)) {
            System.out.println("A Product with name " + product.getProductName() + " already exist");
            return new ResponseEntity<Void>(HttpStatus.CONFLICT);
        }

       productDao.add(product);

       return new ResponseEntity<Void>(HttpStatus.CREATED);
    }

【讨论】:

    【解决方案3】:

    试试这样的。添加 RequestBody 而不是 ModelAttribute。

    @RequestMapping(value = "/add", method= RequestMethod.POST, consumes="application/json")
        public ResponseEntity<Void> createProduct(@RequestBody  Product product) {
            System.out.println("Creating Product " + product.getProductName());
    
            if (productDao.isProductExit(product)) {
                System.out.println("A Product with name " + product.getProductName() + " already exist");
                return new ResponseEntity<Void>(HttpStatus.CONFLICT);
            }
    
           productDao.add(product);
    
           return new ResponseEntity<Void>(HttpStatus.CREATED);
        }
    

    【讨论】:

    • 我也改成那个了。
    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 2017-01-30
    • 2011-08-09
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多