【问题标题】:AngularJs/webAPI: recieving null in the parameter of webAPIAngularJs/webAPI:在 webAPI 的参数中接收 null
【发布时间】:2015-10-26 16:15:04
【问题描述】:

我正在使用 AngularJS,我正在尝试将 json 从我的服务发送到 webAPI 控制器。当我通过发送时,我在 webApi 函数的参数中收到 null。

我的功能服务是:

angular.module('productsApp')
    .service('ProductDetailService', ['$http', function ($http) {
        var urlBase = "/api/productdetail";

        this.Salvar = function (product) {
            var mydata = JSON.stringify(product);
            debugger;

            return $http({
                method: 'POST',
                url: urlBase + "/salvar/" + mydata,
                data: mydata,
                headers: { 'Content-Type': 'application/json' }
            });
        };
    }]);

我在 webAPI 中的代码是:

public class ProductDetailController : BaseController
{
    [Route("api/productdetail/salvar/{item}")]
    [HttpPost]
    public bool Salvar(string item)
    {
        return true;
    }
}

我的 app.js 是:

var app = angular.module('productsApp', ['ngRoute']);

app.config(['$routeProvider', function ($routeProvider)
{
    $routeProvider.when('/', {
        controller: 'ProductController',
        templateUrl: '/Scripts/App/Html/ProductList.html'
    }).
    when('/testprice', {
        controller: 'ProductController',
        templateUrl: '/Scripts/App/Html/ProductDetail.html'
    }).
    when('/editar/1', {
        controller: 'ProductController',
        templateUrl: '/Scripts/App/Html/ProductDetail.html'
    }).
    when('/api/productdetail/salvar/*', {
        controller: 'ProductDetailController',
        templateUrl: '/Scripts/App/Html/ProductDetail.html'
    })
    .otherwise({ redirectTo: '/' });

}]);

服务中的问题是当我在 webService 中添加类型 data: something 时,我收到了 null 并且我必须在完整的 uri 中添加我的数据,例如:

http//.../api/productdetail/salvar/{mydata}

使用它,它正在工作。

怎么了?

【问题讨论】:

  • $http调用服务时mydata的值是多少?
  • 这是一个产品类,我将其转换为 JSON.stringfly
  • 不。那它就行不通了,因为你的参数是你控制器中的字符串类型。它始终为空。
  • @Turbulence 错误,您可以对 json 进行 url 编码并作为查询字符串的一部分发送。这是一个坏主意,但有时您需要这样做以涵盖一些边缘情况......
  • @MatiasFidemraizer - 感谢您提供信息。让我编辑评论。

标签: c# json angularjs asp.net-web-api


【解决方案1】:

Just Food For Thought 吸引了我。如果您有一个属性被设置为无效类型,例如字符串被设置为 json 中的对象。 api 不会翻译任何东西,你会得到一个空值。

【讨论】:

    【解决方案2】:

    如果您想从 HTTP/POST 正文接收纯文本,您需要将 [FromBody] 属性应用于控制器操作的输入参数:

    [Route("api/productdetail/salvar")]
    [HttpPost]
    public bool Salvar([FromBody] string item)
    {
        return true;
    }
    

    虽然您可以采用这种方式,但 WebAPI 期望您设计一个 DTO 并使用 DTO 实例接收 POST 数据(WebAPI 根据其类型将 JSON 反序列化为参数):

    [Route("api/productdetail/salvar")]
    [HttpPost]
    public bool Salvar(MyData item)
    {
        return true;
    }
    

    MyData可能看起来像这样:

    public class MyData
    {
         public string Text { get; set; }
    }
    

    您的 Angular 应用程序应该发送这样的 JSON:{ "Text": "hello world" }

    最后,WebAPI 强制执行 RESTful API 开发,并且您的路由是 RPC 样式的。您应该将其重命名为 api/product/details 并将数据发布到此资源 URI。否则,您就不是在设计 RESTful API!

    请记住,REST 喜欢使用 HTTP 动词来表达动作:

    • POST 是创建
    • PUT 是更新
    • GET 是获取所有、按页面获取或通过 id 获取
    • DELETE 是 按 id、范围等删除
    • ...

    总之,不要将动词放在资源 URI 中,而是使用 HTTP 动词来表达对暴露的资源要做什么。

    【讨论】:

    • 它工作正常。就一个问题。是否可以在javascript中转换为Base4并在将其转换为从base64自动解码的dto mydata的参数中?
    • @David 第一部分是使用btoa 完成的,另一部分会更难,因为您需要实现自定义参数绑定...为什么需要发送 base64 编码... ?
    • 好吧,也许我在想我们需要安全的旧系统,我不知道现在是否有必要
    • @David Base64 不提供安全性。它用于在通过网络发送字符串时避免使用特殊字符,但您需要注意 Base64 会增加发送/接收的数据量这一事实。使用 HTTPS 保护客户端-服务器数据交换!
    • @David 在 WebAPI 文档中查找自定义 http 参数绑定。您需要提供IHttpParameterBinding 实现并在HttpConfiguration 中配置它。顺便说一句,问一个新问题。评论是为了解决当前答案的内容问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    相关资源
    最近更新 更多