Удалить ссылку $ id из списка объектов json в WebApi - PullRequest
0 голосов
/ 22 февраля 2019

Я хотел бы изменить формат данных моего ответа с

{
    "$id": "1",
    "$values": [
        {
            "$id": "2",
            "OrderID": 3,
            "Article": null
        },
        {
            "$id": "3",
            "OrderID": 4,
            "Article": null
        }
     ]
}

на

 [
    {
        "OrderID": 3,
        "Article": null
    },
    {
        "OrderID": 4,
        "Article": null
    }
 ]

Я попытался настроить JsonFormatter в файле WebApiConfig.cs, добавив эти две строки

config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

но не работает.

Код контроллера и его класс наследуются от ApiController

    public List<OrderDto> Get()
    {
        var serviceResult = orderService.LoadOrders();

        if (serviceResult.IsValid)
        {
            var orders = serviceResult.GetObject();

            var ordersDto = Mapper.Map<List<Order>, List<OrderDto>>(orders);

            return ordersDto;
        }
        else
        {
            return null;
        }
    }

Есть идеи для этого решения?

Редактировать 1:

Код OrderDto.cs

public class OrderDto
{
    public int OrderID { get; set; }

    public string Article { get; set; }
}

1 Ответ

0 голосов
/ 22 февраля 2019
  1. Я считаю, что если вы используете Web API, чтобы уточнить типы действий, вы должны украсить их атрибутами, например [HttpGet], [HttpPost] и т. Д.
  2. Я бы использовал Dtosобъекты вместо ViewModel объектов при использовании API, потому что это не чисто архитектура MVC, и многие клиенты могут использовать ваш API различными способами.
  3. Я бы скорее возвратил ответ BadRequest Request.CreateResponse(HttpStatusCode.BadRequest, "error message") с некоторым сообщением об ошибке вВаше утверждение else вместо null.Это было бы быстрым решением, однако я подумал бы о том, чтобы выбросить исключения при реализации вашего сервиса и на основании этого возвращать правильное сообщение об ошибке обратно клиенту.

Это должно работать:

[System.Web.Http.HttpGet]
public HttpResponseMessage GetAllOrders()
{
    //var serviceResult = orderService.LoadOrders();
    // var isValid = serviceResult.IsValid
    var isValid = true;
    if (isValid)
    {
        // I used hardcoded values here just to show how to return a proper result
        // you can call your service instead and do the mapping/other stuff

        var result = new List<OrderDto>()
        {
            new OrderDto(){
                OrderID = 3,
                Article = "blah1"
            },
            new OrderDto(){
                OrderID = 4,
                Article = "blah2"
            }
        };
        return Request.CreateResponse(HttpStatusCode.OK, result);
    }
    else
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest, "Error Message");

    }
}

public class OrderDto
{
    public int OrderID { get; set; }

    public string Article { get; set; }
}

содержимое WebApiConfig.cs:

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
    config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}

Результат

при var isValid = true;

enter image description here

при var isValid = false;

enter image description here

...