C# 如何在ASP.NET web api中接收json?
我有一家外部公司将数据推送到我们的一台服务器,他们将发送JSON数据。我需要创建一个POST api来接收它。这就是我目前所拥有的C# 如何在ASP.NET web api中接收json?,c#,asp.net,json,asp.net-web-api,C#,Asp.net,Json,Asp.net Web Api,我有一家外部公司将数据推送到我们的一台服务器,他们将发送JSON数据。我需要创建一个POST api来接收它。这就是我目前所拥有的 [System.Web.Http.HttpPost] [System.Web.Http.ActionName("sensor")] public void PushSensorData(String json) { string lines = null; try { System.IO.StreamWriter file
[System.Web.Http.HttpPost]
[System.Web.Http.ActionName("sensor")]
public void PushSensorData(String json)
{
string lines = null;
try
{
System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\test.txt");
file.WriteLine(json);
file.Close();
//JSONUtilities.deserialize(json);
}
catch (Exception ex)
{
MobileUtilities.DoLog(ex.StackTrace);
}
}
我通过使用fiddler发送json数据来测试它,但是json是空的。
这是来自fiddler的原始数据
POST http://localhost:31329/mobileapi/pushsensordata/ HTTP/1.1
User-Agent: Fiddler
Host: localhost:31329
Content-Type: application/json
Content-Length: 533
{
"id": {
"server": "0.test-server.mobi",
"application": "test-server.mobi",
"message": "00007-000e-4a00b-82000-0000000",
"asset": "asset-0000",
"device": "device-0000"
},
"target": {
"application": "com.mobi"
},
"type": "STATUS",
"timestamp": {
"asset": 0000000
"device": 00000000,
"gateway": 000000,
"axon_received_at": 00000,
"wits_processed_at": 000000
},
"data_format": "asset",
"data": "asset unavailable"
}
在将JSON.stringify(您的对象)(这是Javascript,但任何语言都有这种实用程序)传递到web api之前,您是否尝试过它
我也可以指出你之前的评论,说你正在使用GET方法,因为你不能让POST工作吗?您应该在规划时小心,因为GET方法只会占用这么多空间:如果对象变大,您将被迫使用POST,因此我建议您立即采用这种方法。在Web API中,您可以让框架为您完成大部分繁琐的序列化工作。首先,将您的方法修改为:
[HttpPost]
public void PushSensorData(SensorData data)
{
// data and its properties should be populated, ready for processing
// its unnecessary to deserialize the string yourself.
// assuming data isn't null, you can access the data by dereferencing properties:
Debug.WriteLine(data.Type);
Debug.WriteLine(data.Id);
}
创建一个类。要开始,请执行以下操作:
public class SensorData
{
public SensorDataId Id { get; set; }
public string Type { get;set; }
}
public class SensorDataId
{
public string Server { get; set; }
}
此类的属性需要镜像JSON的结构。我把向模型中添加属性和其他类的任务留给您完成,但正如所写的那样,这个模型应该可以工作。不符合您的模型的JSON值应该被抛出
现在,当您调用Web API方法时,传感器数据将被反序列化
有关更多信息,请参见您的Web API模型需要与javascript请求对象相同 比如说,
public class SomeRequest
{
public string data1{ get; set; }
public string data2{ get; set; }
public string data13{ get; set; }
}
在Javascript中,您的请求对象和Javascript调用应该如下所示
var requestObj = {
"data1": data1,
"data2": data2,
"data3": data3,
};
public void PushSensorData(SomeRequest objectRequest)
{
objectRequest.data1
objectRequest.data2
objectRequest.data3
并在javascript中发布url和requestObj
Web API中的访问
var requestObj = {
"data1": data1,
"data2": data2,
"data3": data3,
};
public void PushSensorData(SomeRequest objectRequest)
{
objectRequest.data1
objectRequest.data2
objectRequest.data3
你用
HttpGet
修饰了你的方法,但是想要一篇文章吗?我的错是,我试图用GET做些什么,因为我无法让文章工作。这不是你请求中的字符串,它是一个对象。web api知道如何将您的对象序列化为c#对象,只需尝试创建一个对象并将其作为您的参数。重复问题:我正在尝试使用fiddler测试该程序,因为我不知道其他公司正在使用什么。我正在请求正文中传递json。您尝试过json以外的东西吗,比如简单的字符串?如果可行,请尝试将JSON作为简单字符串而不是JSON对象传递。如果您在web api中接受一个字符串,那么在这里没有结果是很正常的。作为测试,您可以将数据类型从string更改为dynamic,看看接下来会发生什么。JSON.stringify
是不相关的,因为JSON@hbulens接收到的已经是格式良好的JSON。我想您并没有通读我的答案。对于格式正确的参数,ASP.NET Web API特别敏感。我已经多次遇到这个问题,而且字符串化json对象几乎每次都能正常工作。注意,我删除了[ActionName]
属性。它对你没有多大帮助。有关更多信息,请参阅。因此,我创建了SensorData类。如何访问api方法中的数据?是否需要执行此SensorReading sr=新建SensorReading();并使用getters访问数据
参数应为传感器数据
对象。您可以通过取消引用数据的属性来访问数据。我将更新我的答案来帮助说明这一点。我鼓励您使用一个简单的模型和相应的简单JSON来尝试这一点。习惯Web API的工作方式,然后在复杂性中扩展模型。即使字段名温度发生变化,是否有方法获取数据中的值“data”:{“temperature”:“37C”}