为什么我的$ resource POST导致404错误?

时间:2018-02-01 17:16:40

标签: c# angularjs post angular-resource

我有一个接受Id和bool的.Net移动服务API。如果我使用正确的参数和标题从Postman调用API,它可以正常工作。当我从我的AngularJs应用程序调用它时,我收到404错误,我无法弄清楚原因。

我的后端API方法如下所示:

[HttpPost]
public async Task<IHttpActionResult> SetHoldStatus(string id, bool isHeld) 
  => Ok(new 
    { 
        Transfer = await _workItemRepository.SetTransferHoldStatus(id, isHeld) 
    });

我的AngularJs控制器如下所示:

(function () {
angular
    .module("pinnacleWarehouser")
    .controller("TransferListCtrl",
    ["transfers",
        "transferWorkItemHoldResource",
        TransferListCtrl]);

function TransferListCtrl(transfers, transferWorkItemHoldResource) {
    var vm = this;

    vm.transfers = transfers;
    vm.length = transfers.length;
    if (vm.length > 0) {
        vm.branch = transfers[0].branchId;

        for (var i = 0; i < vm.transfers.length; i++) {
            vm.transfers[i].transferId = vm.transfers[i].transferId.trim();
        };
    }
    vm.changeHold = function (transferId, isHeld) {
        transferWorkItemHoldResource.save({ Id: transferId, IsHeld: isHeld });
    };
}}());

我的资源如下:

(function () {
"use strict";

angular
    .module("common.services")
    .factory("transferWorkItemHoldResource",
    ["$resource", transferWorkItemHoldResource]);

function transferWorkItemHoldResource($resource) {
    return $resource("https://my-test-url.net/api/TransferWorkItem/SetHoldStatus", {}, {
        save: {
            method: 'POST',                 
            headers: { 'ZUMO-API-VERSION': '2.0.0' }
        }
    });
}}());

因此,当我从Postman调用API时,它会使用我发送的bool作为参数更新记录。它有效。

当我运行应用程序并调用API时,这就是我得到的:

enter image description here

查看开发工具中的请求标头,我可以看到我的参数位于请求有效负载中:

enter image description here

我从未尝试过使用$ resource来自定义标头和参数,因此我可能会遗漏一些东西。我希望有人可以指出我做错了什么。

1 个答案:

答案 0 :(得分:1)

您应该将action参数定义为复杂对象。

改变它

public async Task<IHttpActionResult> SetHoldStatus(string id, bool isHeld)

public async Task<IHttpActionResult> SetHoldStatus(SetHoldStatusInput input)

public class SetHoldStatusInput
{
    public string Id { get; set; }

    public bool IsHeld { get; set; }
}