将数据从pi发布到MVC Restful服务

时间:2019-11-23 21:20:19

标签: c# node.js express

我有一个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选项,但是没有任何作用,我很沮丧。

0 个答案:

没有答案