【问题标题】:AngularJS Put Returning 404AngularJS 放返回 404
【发布时间】:2014-07-23 19:07:58
【问题描述】:

在使用 AngularJS 的“$http.put”时,我在 PUT 请求中遇到 404 错误。

这是我的相关 AngularJS 代码:

    /* toggles whether or not the link is disabled */
    toggleLinkStatus: function (isActive, linkGUID) {
        $http.put('/Explorer/Link/ToggleLinkStatus',
                {

                            isActive: isActive,
                            linkGUID: linkGUID
                }
        );
    }

还有我相关的 C# 控制器代码:

    [HttpPut]
    public IHttpActionResult ToggleLinkStatus(Boolean isActive, Guid linkGUID)
    {
        return Ok();
    }

还有我的 WebApiConfig 代码

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        /** define routes for Explorer API */
        config.Routes.MapHttpRoute(
            name: "ExplorerAPI",
            routeTemplate: "Explorer/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

我在这里缺少什么?在调用的标头中,我可以看到数据正在请求有效负载中传递:

isActive: true
linkGUID: "b94badb3-2917-4129-9ae3-35d2a635f66d"

如果我使用 POSTMAN 执行普通查询字符串 PUT,它会通过,但当我使用 AngularJS 时不会。

更新

这里有一些有趣的事情,如果我使用以下 angularJS 请求,它会通过:

    /* toggles whether or not the link is disabled */
    toggleLinkStatus: function (isActive, linkGUID) {
        $http.put('/Explorer/Link/ToggleLinkStatus',
                {
                    isActive: isActive,
                    linkGUID: linkGUID
                },
                {
                    params:
                        {
                            isActive: isActive,
                            linkGUID: linkGUID
                        }
                }
        );
    }

它也适用于:

    /* toggles whether or not the link is disabled */
    toggleLinkStatus: function (isActive, linkGUID) {
        $http.put('/Explorer/Link/ToggleLinkStatus',
                {
                },
                {
                    params:
                        {
                            isActive: isActive,
                            linkGUID: linkGUID
                        }
                }
        );
    }

【问题讨论】:

  • 不确定,您是否尝试过在网址后使用“/”?你试过 jquery $.put() 吗? LinkController 是 ApiController 吗?这有点不同。通常,您只需将一些 json 放入带有 id 的 url 中,并期望获取相同的 URL 会返回您刚刚放入的 JSON...
  • 我只是放了一个斜杠,没有结果,同样的错误。 LinkController 确实是一个 ApiController。

标签: c# javascript ajax asp.net-mvc angularjs


【解决方案1】:

尝试更改控制器操作以使用类而不是原始数据类型。 MVC 尝试从 URI 而不是请求正文中读取这些内容。

像这样:

[HttpPut]
public IHttpActionResult ToggleLinkStatus(RequestModel model)
{
    // model.IsActive ...
    return Ok();
}

public class RequestModel {
    bool IsActive {get;set;}
    Guid LinkGuid {get;set;}
}

【讨论】:

  • 所以任何时候我想从请求正文中获取数据都需要使用一个类?即使我尝试 PUT 的只是一个布尔值或单个字符串对象?
  • 仅供参考,这不起作用。它没有正确传递数据。方法被调用,但布尔值始终为假,Guid 始终全为零。
  • @RyanDuffing 如果您在请求中使用单个原始值,则可以使用 [FromBody] 属性来指示该值在请求正文中。对于多种原始类型,您必须使用自定义类。
【解决方案2】:

如果您成功使用 GET(通过在浏览器地址栏中执行此操作)但未成功使用 PUT,那么您配置路由的方式/等有问题。我看不出它在什么您在此处拥有的代码 sn-p,但是您配置路线的方式肯定有问题。也许有一条较早的路线与正在犯规的 GET 相匹配。这不是 Angular 的错。您可以使用 Chrome 的 PostMan 插件进行测试,它可以让您发送 PUT/POST/DELETE 以及 GET 并且您可以看到结果。

【讨论】:

  • 我实际上已经尝试过使用带有 PUT 请求的 PostMan 并成功通过。
  • 我想我的意思是说我使用 POSTMAN 而不是使用浏览器地址栏。对于错误信息,我深表歉意。
猜你喜欢
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多