Web API 和 AngularJs

Posted

技术标签:

【中文标题】Web API 和 AngularJs【英文标题】:Web Api and AngularJs 【发布时间】:2014-08-03 05:28:15 【问题描述】:

直奔问题:

有一个 angularJs 控制器,它调用工厂内部定义的函数。 工厂函数调用接受“[FromBody]string”参数的 Api POST 操作。 问题正是在这里提出的。实际上,参数始终为空!而在工厂方法内部,它具有所需的值。下面是一段代码:

angularJs 控制器:

$scope.readText = function() 

        var element = document.getElementsByClassName('news-content');

        if (element[0] != undefined) 
            elementPureText = element[0].innerText;
        

        dataFactory.createTextFile(elementPureText)
            .succes(function(data, status, headers, config) 

            ).error(function(data, status, headers, config) 

            );
    ;

工厂代码:

philadelphiaApp.factory('dataFactory', ['$http', function ($httpt) 

var dataFactory = ;

dataFactory.createTextFile = function (text) 
    return $httpt.post('api/textmanager/textWriter',  '': text );
;

return dataFactory;

]);

最后是 ApiController:

[HttpPost]
    [ActionName("TextWriter")]
    public HttpResponseMessage PostTextWriter([FromBody]string text)
    
        if (String.IsNullOrEmpty(text) || text.Length == 0)
        
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
        

        if (!Directory.Exists(FileDirectory))
        
            try
            
                Directory.CreateDirectory(FileDirectory);
            
            catch (Exception)
            

                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
            
        

        try
        
            File.WriteAllText(FileDirectory, text);
        
        catch (Exception)
        
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
        

        return Request.CreateResponse(HttpStatusCode.OK, text);
    

通过网络访问和搜索后,我遇到了很多提供解决方案的论坛和网站,但我还无法处理。我认为最好的是以下 URL:

http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

非常感谢您对此提供的任何帮助...

【问题讨论】:

【参考方案1】:

问题与数据的编码方式以及 WebAPI 如何在后端尝试反序列化有关。

默认情况下,$http 将通过 content-type:application/json 传递所有 POST 请求,并尝试以这种方式对您的数据进行编码。您可以尝试将content-type 设置为text/plain 之类的东西,但是您需要一个自定义媒体格式化程序才能让WebAPI 能够处理它。

您在这里阻力最小的路径是创建一个简单的请求对象,如下所示:

public class TextWriterRequest

    public String Text  get; set; 

然后修改您的方法以接受该对象作为输入。无需使用[FromBody],因为 WebAPI 默认会在 body 中查找复杂对象。

public HttpResponseMessage PostTextWriter(TextWriterRequest text)

然后您可以通过$http 服务确保您传递的数据与请求对象匹配:

$http(
    method: 'POST',
    url: '/api/textmanager',
    data:  text: text 
);

这将在服务上正确反序列化,生活将再次美好。

【讨论】:

嗯.. 你的建议似乎是一个合理的解决方案,但我很遗憾地说,不,它不适用于我的代码......正如我正在开发一个示例应用程序并完全出来想法..我会从头开始创建一个新的解决方案,也许我可以弄清楚! @AliAshoori - 这对我来说似乎很奇怪。主要是因为我在回答这个问题之前实际上创建了一个解决方案,只是为了确保它按预期工作。【参考方案2】:

您正在发送一个对象,其中包含一个名为 ''(空字符串)的字段和您的文本值。但是,您的 webapi 后端需要一个字符串,而不是一个对象。无法将对象反序列化为字符串,所以会为null。

您需要直接发送字符串,而不是将其填充到对象中。像这样:

return $httpt.post('api/textmanager/textWriter', text);

【讨论】:

谢谢我之前做过,但仍然是 NULL 值。实际上,我按照上述 URL 中的建议发送了对象(在我的问题中)【参考方案3】:

其实经过几天的努力,我找到了答案……而且看起来很容易;只需在 web api 客户端调用中添加 Content-Type: application/json 就可以了! 但感谢那些提供解决方案的人。

【讨论】:

以上是关于Web API 和 AngularJs的主要内容,如果未能解决你的问题,请参考以下文章

API和web API

Laravel 路由、api 和 web 用例

Web APi 2.0优点和特点?在Web APi中如何启动Session状态?

Asp.Net Web API 2第六课——Web API路由和动作选择

API和Web API

使用 HttpClient 和 Web API 方法 [FromBody] 参数发布到 Web API 最终为空