我有一个MVC5 Web Api Web应用程序,正在尝试将传感器数据发送到该应用程序。
我的控制器;
[HttpGet]
[Route("api/Sensor/GetByTopic")]
public IHttpActionResult GetByTopic(string name)
{
string url = "getByTopic/" + name;
List<SensorData> svn = GetData(url);
return Ok(svn);
}
[AcceptVerbs("POST", "GET")]
[HttpPost]
[Route("api/Sensor/addRow")]
public IHttpActionResult addRow([FromBody]string data)
{
TagCollectionRepository.AddTag(data);
return Ok();
}
在Pi上,我有一个非常基本的Node.JS应用程序来获取和发布数据。 GET工作正常,但POST给我带来了问题。控制器收到请求,但data参数始终为null,因此我认为我在Pi应用程序中发送的主体数据错误。
Pi代码;
var request = require('request-promise')
var exp = require('express')
var app = exp();
const opts = {
method: 'GET',
url: 'http://www.jaxcoder.com/api/Sensor/getAll'
}
//This call works fine
request(opts){
.then(function(res) {
console.log('res);
})
.catch(function(err) {
console.log('err: ', err);
});
const options = {
headers: { 'content-type' : 'application/x-www-form-urlencoded' },
method: 'POST',
url: 'http://jaxcoder.com/api/Sensor/addRow',
form: {
data: 'From Pi'
}
}
request(options)
.than(function(res) {
console.log('resp: ', res);
})
.catch(function(err) {
console.log('err: ', err);
});
app.get('/', (req, res) => res.send('hello'));
app.listen(3000);
当我创建addRow方法时,我只是粘贴了一个字符串参数,以查看是否可以从Pi传递到Web Api服务。事实证明,在Web Api中,复杂值很容易,但是捕获原始请求正文数据却不容易。
因此解决方案是添加一个视图模型类;
public class StringViewModel {
public string data { get; set; }
}
然后更改addRow方法以反映更改。
我在Rick Strahl的帖子中找到了答案,并接受了ASP.NET Web API的原始请求正文内容
我已经尝试过搜索各种POST选项,例如使用body而不是带有“ json:true o”选项的形式,而忽略了headers选项,但是没有任何作用,我很沮丧。