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的主要内容,如果未能解决你的问题,请参考以下文章
Web APi 2.0优点和特点?在Web APi中如何启动Session状态?