У меня проблема с JSONAPI .NET.
Прежде всего, поскольку для JSONAPI .NET нет документации, я не могу быть уверен, что все настройки выполнены правильно. Так или иначе, дело обстоит следующим образом:
WebApiConfig.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Web.Http;
using JSONAPI.Json;
using JSONAPI.Core;
namespace MyProjectWebApi
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
JsonApiFormatter formatter = new JsonApiFormatter();
formatter.PluralizationService = new PluralizationService();
config.Formatters.Add(formatter);
GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(formatter);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
У меня есть собственный класс и контроллер в MyClassController.cs:
namespace MyClassCreation
{
[Serializable]
public class MyClass
{
public string Param1 { get; set; }
public string Param2 { get; set; }
public string Param3 { get; set; }
public string Param4 { get; set; }
public MyClass(string param1, string param2, string param3, string param4)
{
Param1 = param1;
Param2 = param2;
Param3 = param3;
Param4 = param4;
}
}
public class MyController : JSONAPI.Http.ApiController<MyClass>
{
public HttpResponseMessage PostMyClass(MyClass newMyClass)
{
try
{
...
}
catch (Exception x)
{
Messages.WriteLog(x);
throw x;
}
}
public IEnumerable<MyClass> GetMyClass(string value)
{
{
List<MyClass> result = new List<MyClass>();
result.Add(new MyClass(value, "2", "3", "4"));
return result;
}
catch (Exception x)
{
Messages.WriteLog(x);
throw x;
}
}
}
}
Проблема в том, что GET работает, а POST нет. Я использовал Postman для генерации вызовов на сервер. Get проходит нормально и возвращает то, что должно. Поместите POST никогда не направлен на какой-либо маршрут. Сервер замечает вызов, а метод перехвата POST-вызова — нет.
Я также написал конструктор по умолчанию для MyClassController. Код попадает туда в отладчике, но уже не в метод PostMyClass.
Я также попробовал несколько атрибутов для метода, таких как [HttpPost] и [Route(...)].
Самое смешное, что когда я наследую MyClassController напрямую от класса .NET ApiController, POST работает, но я не получаю никаких данных JSON, поэтому у меня нет данных для работы.
Любая помощь?
Спасибо!!!
РЕДАКТИРОВАТЬ:
Замечено, что JSONAPI .NET требует, чтобы его метод базового класса ApiController был перезаписан и использовался для перехвата POST-вызова. Итак, теперь я могу получить POST-вызов, но все же полученные данные являются нулевыми, хотя исходные данные, отправленные в части тела сообщения, должны быть стандартным объектом JSON JSONAPI.
public override IList<MyClass> Post(IList<MyClass> postedObjs)
{
return base.Post(postedObjs);
}
Данные были:
{
"data": [{
"type": "myClass",
"attributes": {
"param1": "1",
"param2": "2",
"param3": "3",
"param4": "4"
}
}]
}
Итак, проблема в том, что postObj имеет значение null.
{ "myClasss": { "type": "myClass", "id": "1", "param1": "1", "param2": "2", "param3": "3", "param4": "4" } } //MyClasss is supposed to be plural of the myClass
21.09.2015