Javascript ngResource PUT返回错误请求,因为JSON对象中有$PROMITE和$RESOLVERED

Javascript ngResource PUT返回错误请求,因为JSON对象中有$PROMITE和$RESOLVERED,javascript,json,angularjs,ngresource,Javascript,Json,Angularjs,Ngresource,在过去的几个小时里,我一直在努力解决这个问题,每个教程都指向我已经实现的解决方案,但它不起作用 基本上,我的PUT请求返回一个错误: PUT http://localhost:8083/stockapi/rest/stocks/5485cba248673a0dd82bb86f 400 (Bad Request) 当我截获请求时,我看到它包含$PROMITE和$RESOLEDED数据元素: > {"id":"5485cba248673a0dd82bb86f","name":"iShares

在过去的几个小时里,我一直在努力解决这个问题,每个教程都指向我已经实现的解决方案,但它不起作用

基本上,我的PUT请求返回一个错误:

PUT http://localhost:8083/stockapi/rest/stocks/5485cba248673a0dd82bb86f 400 (Bad Request)
当我截获请求时,我看到它包含$PROMITE和$RESOLEDED数据元素:

> {"id":"5485cba248673a0dd82bb86f","name":"iShares ESTOCK DivXXX","ticker":"AMS:IDVY","url":"https://www.google.com/finance?q=AMS%3AIDVY&ei=F5BxVLiCB8GlwQPJ1YD4DQ","currency":"EUR","currentPrice":19.81,"currentPriceInEuro":19.81,"lastModified":1418054562234,"historyStockPrices":[{"timestamp":1418054562234,"price":19.81}],"$promise":{},"$resolved":true}
这是有道理的,因为我使用的是ngResource对象——但每个教程都显示以下代码应该能够处理它,但它不能

注意/编辑:如果我通过外部程序(如Postman REST client)放置JSON对象,而不包含$promise和$resolved元素,那么它可以正常工作

工厂:

控制器注意:执行4次更新,但均不起作用,是相同错误请求的4倍:

.controller'StockEditController',函数$scope、$log、$http、$state、$stateparms、Stock{

})

我现在真的不知道如何以正确的方式使用ngResource对象,以便我可以使用它来放置/发布到我的Web服务。有什么想法吗

谢谢

编辑: Chrome网络输出:

响应头

Remote Address:[::1]:8080
Request URL:http://localhost:8080/stockapi/rest/stocks/5485cba248673a0dd82bb86f
Request Method:PUT
Status Code:400 Bad Request
Request Headersview parsed
PUT /stockapi/rest/stocks/5485cba248673a0dd82bb86f HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 355
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: http://localhost:8080/stockapi/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Request Payloadview parsed
{"id":"5485cba248673a0dd82bb86f","name":"iShares ESTOCK DivXXXYYY","ticker":"AMS:IDVY","url":"https://www.google.com/finance?q=AMS%3AIDVY&ei=F5BxVLiCB8GlwQPJ1YD4DQ","currency":"EUR","currentPrice":19.81,"currentPriceInEuro":19.81,"lastModified":1418054562234,"historyStockPrices":[{"timestamp":1418054562234,"price":19.81}],"$promise":{},"$resolved":true}
Response Headersview parsed
HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 968
Date: Tue, 09 Dec 2014 06:36:24 GMT
Connection: close
根据报告,您没有正确使用更新操作

因此,实际上您的updateStock方法应该是:

$scope.updateStock=function(stock) {
    Stock.update({id: stock.id}, stock);

    Stock.update({id: $scope.stock.id}, $scope.stock);   //not sure why you have 2 calls here

    $state.go('stocks');
};

只要看看工厂定义以及它与我的定义的区别,您就应该将工厂定义的第二个参数更改为数组,如下所示:

.factory('Stock',[$resource, function($resource){
    return $resource('http://localhost:8083/stockapi/rest/stocks/:id',
        { id: '@id' },{
            update: { method: 'PUT' },
            show: { method: 'GET' }
    }); 
}]);
不确定这是否是问题所在,但这至少与angular docs在依赖项注入方面的定义有很大不同:


如果没有,您能否在GET返回数据后打印$scope.stock的内容?

我知道这个问题非常古老,但我偶然发现了同样的问题,发现了这个问题以及这个问题:

有一个答案解释了这个问题是由于CORS的交叉起源。这意味着您的服务器端需要允许它。如果您使用的是Spring MVC,在控制器请求映射处添加org.springframework.web.bind.annotation.CrossOrigin注释就足够了:

@CrossOrigin
@RequestMapping(value = "/product/{id}", method = RequestMethod.POST)
@ResponseBody
public void editProduct(@PathVariable("id") final long id, @RequestBody final ProductDto productDto) {
    // your code
}

在我看来,服务器控制器似乎没有配置为接受PUT请求,或者它接受POST。请检查并复制粘贴Chrome控制台网络选项卡中的日志,以显示实际发送的网络数据。服务器接受PUT请求。当我从JSON对象中删除$promise和$resolved元素并使用REST客户端(如PostMan Chrome Extension)时,我就可以毫无问题地更新对象了。我们还将查看Chrome控制台的网络选项卡。好的,然后请向我们展示您的客户端发送到服务器网络选项卡的内容。我打赌答案/线索在那里。现在添加到主帖子中。谢谢你的帮助。你能在请求有效负载上点击“查看源代码”让我们看到整个过程吗?嗨。我打了两个电话只是因为我尝试了两种不同的方法。不幸的是,在update方法中添加id不会改变任何东西。功能保持不变,但我不断收到错误的请求,因为它们$promise和$resolve元素仍然在JSON上。很抱歉响应太慢,我一直很忙。如果我这样运行它,我会收到一条错误消息:uncaughtreferenceerror:$resource未定义-但是,根据您链接的文档,它似乎应该是这样工作的。今晚晚些时候我将进一步调查。谢谢你的回复。
.factory('Stock',[$resource, function($resource){
    return $resource('http://localhost:8083/stockapi/rest/stocks/:id',
        { id: '@id' },{
            update: { method: 'PUT' },
            show: { method: 'GET' }
    }); 
}]);
@CrossOrigin
@RequestMapping(value = "/product/{id}", method = RequestMethod.POST)
@ResponseBody
public void editProduct(@PathVariable("id") final long id, @RequestBody final ProductDto productDto) {
    // your code
}