How to receive json in ASP.NET web api?
我有一家外部公司将数据推送到我们的服务器之一,他们将发送JSON数据。 我需要创建一个POST api来接收它。 这就是我到目前为止
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [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); } } |
我通过使用提琴手发送json数据来测试它,但是json为null。
这是来自提琴手的原始数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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" } |
在Web API中,您可以让框架为您完成大部分繁琐的序列化工作。首先将您的方法修改为:
1 2 3 4 5 6 7 8 9 | [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); } |
创建一个类。为了帮助您入门:
1 2 3 4 5 6 7 8 9 10 | 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方法时,传感器数据将已经反序列化。
有关更多信息,请参见http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
您的Web API模型必须与javascript请求对象相同
例如,
1 2 3 4 5 6 7 8 | public class SomeRequest { public string data1{ get; set; } public string data2{ get; set; } public string data13{ get; set; } } |
在Javascript中,您的请求对象和javascript调用应如下所示
1 2 3 4 5 6 | var requestObj = { "data1": data1, "data2": data2, "data3": data3, }; |
并在javascript中发布url和requestObj
像这样在Web API中进行访问
1 2 3 4 5 | public void PushSensorData(SomeRequest objectRequest) { objectRequest.data1 objectRequest.data2 objectRequest.data3 |
在将JSON.stringify(yourObject)(这是Javascript,但任何一种语言都具有这种实用程序)之前,都尝试过了吗?
我还可以指出您的评论吗,因为您无法执行POST,因此您正在使用GET方法?您应该在计划中谨慎,因为GET方法只能占用太多空间:如果对象变大,则将被迫使用POST,因此建议您立即采用这种方法。